java - 使用反射调用方法

标签 java reflection

我试图弄清楚如何调用自定义类的方法。这是我正在尝试做的事情的过程:

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

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(...)
}

问题是,我知 Prop 体是什么我不知道,我只是很难找到答案。这些是我需要回答的问题:

1) 哪个对象将实际使用调用函数?就我而言,它是我想要调用的特定方法,还是我试图调用的类的实例?

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

3) 就我而言,我希望调用的方法实际上并不带任何参数,因此当我碰巧弄清楚调用函数如何工作时,我是否需要将其中一个参数设置为 null,或者我会忽略参数列表的那部分吗?

最佳答案

您错误地使用了.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");
    }
}

输出:

method call

更多信息请参见 docs .

Invokes the underlying method represented by this Method object, on the specified object with the specified parameters.

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

关于java - 使用反射调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20362439/

相关文章:

c# - 使用反射查找实现的接口(interface)

java - 使用 SimpleXml 无法解析日期

java - 保存工作但在 hibernate 4.1.1 中仍然不工作

java - 按 Lucene 词典中的用法对建议的单词进行排序

java - Field 中原始 getter/setter 的目的是什么?

php - 您可以解决 PHP 中超出范围的后期静态绑定(bind)吗?

objective-c - 使用 objc_msgSend 调用带有命名参数的 Objective C 函数

java - JLabel 和 JRadiobutton 之间差距巨大?

java - Android:尝试使用 AsyncTask 和 JSON 下载图像时崩溃

java - 是否可以扩展一个具有自身实例作为字段的类,以便子类具有子类的实例?