我试图在我的应用程序启动时调用自定义类和方法来执行开发测试。我已经在我的SettingsClass中存储了我的测试类和方法的设置,如下所示。
public class SettingsClass {
public static final boolean BOOT_TEST = true;
public static final String BOOT_CLASS = "MyClass";
public static final String BOOT_METHOD = "MyMethod";
}
我的主要课程。
public class MainClass {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
if(SettingsClass.BOOT_TEST) {
Method method = getDeclaredMethodClass(SettingsClass.BOOT_CLASS).getDeclaredMethod(SettingsClass.BOOT_METHOD);
method.invoke();
System.exit(1);
}
}
是否可以执行上述操作?
任何帮助都将不胜感激。
答案 0 :(得分:3)
您需要对Class类型的引用和类的实例(除非您要调用的方法是静态的)。在您的伪代码中,您有正确的想法,您需要做的就是快速查看java.lang.Class
和java.lang.reflect.Method
public class SettingsClass {
public static final boolean BOOT_TEST = true;
public static final String BOOT_CLASS = "MyClass";
public static final String BOOT_METHOD = "doMain";
}
public class MyClass {
public static void doMain() {
}
}
public class MainClass {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
if(SettingsClass.BOOT_TEST) {
Class<?> clazz = Class.forName(SettingsClass.BOOT_CLASS);
Method m = clazz.getMethod(SettingsClass.BOOT_METHOD);
m.invoke(null);
System.exit(1);
}
}
答案 1 :(得分:2)
对于.invoke(),您需要一个对象,该对象是您的类的实例。
如果你的类有一个公共默认的consturctor你应该可以做这样的事情
// load your class
Class<?> clazz = Class.forName("full.package.and.class.name");
// get the method
Method method = clazz.getDeclaredMethod("methodName");
// create an instance of your class
Object object = clazz.newInstance();
// call the method in context of object
method.invoke(object);
答案 2 :(得分:1)
您可以参考Java 反射(方法调用)
http://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html
你可以通过
找到方法Class<?> c = Class.forName("nameClass");
Object t = c.newInstance();
Method[] allMethods = c.getDeclaredMethods();
您可以通过
致电m.setAccessible(true);
Object o = m.invoke(t, .... )
答案 3 :(得分:1)
是的,确实如此。以下代码将执行someMethod
中的方法MainClass
。
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MainClass {
public static final boolean BOOT_TEST = true;
public static final String BOOT_CLASS = "MainClass";
public static final String BOOT_METHOD = "someMethod";
public static void main(String[] args) throws InstantiationException,
IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
if (MainClass.BOOT_TEST) {
Class bootClass = Class.forName(BOOT_CLASS);
Method bootMethod = bootClass.getDeclaredMethod(BOOT_METHOD, null);
bootMethod.invoke(null, null);
}
}
public static void someMethod() {
System.out.println("Some method executing...");
}
}
您需要做的是通过使用传入类名称的静态方法Class.forName(String)
来获取您希望动态执行其方法的类的类对象。随后您可以使用getDeclaredMethod(String, Class<?>...)
传递方法的名称和参数类型来请求您希望执行的方法。接下来,您可以使用两个空参数在方法上调用invoke(Object, Object...)
(在没有任何参数的情况下,在没有类的实例(静态执行)上执行该方法)。