如何引用匿名内部类方法' helloWorld'从外面使用反射

时间:2018-06-05 03:46:15

标签: java reflection inner-classes

以下是我的示例课程。如您所见,我已经定义了一个类InnerClass,并在main方法中创建了一个实例。但是,我没有使用普通声明,而是使用基类中没有的方法声明了它的匿名内部类。

现在我知道如果我在InnerClass中声明helloWorld(),那么我可以在通过匿名内部类创建的实例上访问此方法。

但我想知道,如果可以在我的代码中没有在基类中声明的情况下调用此方法。我尝试过探索反射API,但没有运气

import java.lang.reflect.Method;

public class InnerClass {
int i = 10;

public static void main(String[] args) {
    InnerClass inner = new InnerClass() {
        void helloWorld() {
            System.out.println("Hello");
            System.out.println(this.getClass().getEnclosingMethod());
        }
    };
    System.out.println(inner.getClass().getEnclosingMethod());
    Method[] method = inner.getClass().getDeclaredMethods();

    // Call helloworld method here

    for (Method me : method) {
        System.out.println(me.getName());
    }
}
}

2 个答案:

答案 0 :(得分:1)

getDeclaredMethod检索可以使用invoke执行的方法:

Method method = inner.getClass().getDeclaredMethod("helloWorld");
method.invoke(inner);

答案 1 :(得分:0)

以下代码使用getDeclaredMethod查找您想要的Method,然后调用invoke来调用它。

import java.lang.reflect.*;

public class InnerClass {

    public static void main(String[] args) {
        InnerClass inner = new InnerClass() {
            void helloWorld() {
                System.out.println("Hello");
                System.out.println(this.getClass().getEnclosingMethod());
            }
        };

        try {
            Method m = inner.getClass().getDeclaredMethod("helloWorld");
            m.invoke(inner);
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

输出:

Hello
public static void InnerClass.main(java.lang.String[])