使用反射调用方法

时间:2013-12-03 21:50:11

标签: java reflection

我试图弄清楚如何调用自定义类的方法。这是我想要做的过程:

1)我从我的自定义类的方法列表中初始化一个方法数组,以及一个空的List of Method,它将用于保存这些方法的过滤列表。

Method method[] = MyClass.getDeclaredMethods();
List<Method> x = new ArrayList<Method>();

2)然后,我通过for循环运行我的方法数组,并过滤​​掉任何不符合我要求的标准的方法。

 for (Method m : methods){
       if(...){
          if(...){
               x.add(m);
          }
       }
    }

3)最后,我需要调用最终列表中的每个方法。这是我被卡住的地方,我不确定调用函数是如何工作的。这是我正在尝试的:

for(int i=0; i < x.size(); i++){
    boolean g = x.get(i).invoke();
        if(...)
        else(...)
}

问题是,我知道它究竟是什么我不知道,我只是找不到答案。这些是我需要回答的问题:

1)哪个对象实际上会使用调用函数?在我的例子中,它是我想要调用的特定方法,还是我试图调用的类的实例?

2)我知道invoke函数将需要参数,其中一个参数是方法的参数数据。我不清楚的是第一个论点究竟是什么。我认为第一个参数是实际的方法本身,但后来我遇到了一个逻辑循环,因为我编码的方式有使用invoke函数的方法,所以我很难过。

3)在我的例子中,我想调用的方法实际上并没有采用任何参数,所以当我确实想弄清楚调用函数是如何工作的时候,我是否需要将其中一个参数设置为null,或者我会省略参数列表中的那部分吗?

1 个答案:

答案 0 :(得分:3)

您错误地使用了.invoke。见这个简短的例子:

public class Test {
    public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        X obj = new X();
        Method method = obj.getClass().getMethod("test", null);
        method.invoke(obj, null);
    }   
}

class X {
    public void test(){
        System.out.println("method call");
    }
}

输出:

  

方法调用

docs

中的更多信息
  

在具有指定参数的指定对象上调用此Method对象表示的基础方法。

您从未指定过对象或参数。我的示例不使用参数,因此我可以改为null。但无论哪种方式,您都必须提供一个实例作为第一个参数(除非它是static)。