无法从 Maven 测试单元中调用 sun.security.tools.keytool.Main
cannot call sun.security.tools.keytool.Main from within maven test units
我得到 (oracle jdk 8)
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
Method.invoke
需要一个 Object
的数组,代表(几乎)任意数量的参数。 main
方法需要一个 具有数组类型的单个 参数。
因此您可以使用
调用它
mainMethod.invoke(null, new Object[]{ new String[]{"-help"} });
或者,因为它是一个 varargs 方法:
mainMethod.invoke(null, (Object)new String[]{"-help"});
在后一种情况下,将其强制转换为 Object
会强制编译器将其视为单个参数,该参数将自动包装到一个数组中(这就是可变参数方法的作用)。
请注意,您也可以在查找中使用可变参数功能:
Method mainMethod = keytoolClazz.getMethod("main", String[].class);
类型将自动包装到数组中。
我得到 (oracle jdk 8)
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
Method.invoke
需要一个 Object
的数组,代表(几乎)任意数量的参数。 main
方法需要一个 具有数组类型的单个 参数。
因此您可以使用
调用它mainMethod.invoke(null, new Object[]{ new String[]{"-help"} });
或者,因为它是一个 varargs 方法:
mainMethod.invoke(null, (Object)new String[]{"-help"});
在后一种情况下,将其强制转换为 Object
会强制编译器将其视为单个参数,该参数将自动包装到一个数组中(这就是可变参数方法的作用)。
请注意,您也可以在查找中使用可变参数功能:
Method mainMethod = keytoolClazz.getMethod("main", String[].class);
类型将自动包装到数组中。