在Java中使用变量调用类和方法

时间:2014-01-27 14:55:52

标签: java java-ee

我试图在我的应用程序启动时调用自定义类和方法来执行开发测试。我已经在我的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);
            }
}

是否可以执行上述操作?

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:3)

您需要对Class类型的引用和类的实例(除非您要调用的方法是静态的)。在您的伪代码中,您有正确的想法,您需要做的就是快速查看java.lang.Classjava.lang.reflect.Method

的javadoc
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...)(在没有任何参数的情况下,在没有类的实例(静态执行)上执行该方法)。