2015-09-10 8 views
1

Я получаю (Oracle JDK 8)не может вызвать sun.security.tools.keytool.Main внутри зачетных единиц Maven

java.lang.IllegalArgumentException: argument type mismatch 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at ....KeyStoreCreationTest.test(KeyStoreCreationTest.java:41) 

для

Class<?> keytoolClazz = Class.forName("sun.security.tools.keytool.Main"); 
    Method mainMethod = keytoolClazz.getMethod("main", new Class[] { String[].class }); 
    log.info(mainMethod); 
    Object[] params = new String[]{"-help"}; 
    mainMethod.invoke(null, params); 

или

mainMethod.invoke(null, new String[]{"-help"}); 

Если я попытаюсь вызвать метод напрямую, он говорит, что такого пакета нет.

Любые идеи?

В журнале Отчет о выходах:

public static void sun.security.tools.keytool.Main.main(java.lang.String[]) throws java.lang.Exception 

ответ

2

Method.invoke ожидает массивы Object с, представляющими (почти) произвольным числом аргументов. Метод main ожидает одного аргумента, который имеет тип массива.

Таким образом, вы можете вызвать его с помощью

mainMethod.invoke(null, new Object[]{ new String[]{"-help"} }); 

или, так как это переменной длины метод:

mainMethod.invoke(null, (Object)new String[]{"-help"}); 

В последнем случае, отбрасывая его Object вынуждает компилятор лечить как один аргумент, который автоматически включается в массив (что и есть методы varargs).

Обратите внимание, что вы можете использовать функцию списков параметров на поиске, а также:

Method mainMethod = keytoolClazz.getMethod("main", String[].class); 

типа будет получать автоматически упаковывается в массив.