如何使用反射从外部获取对匿名内部 class 方法 'helloWorld' 的引用
How can I get reference to anonymous inner class method 'helloWorld' from outside using reflection
下面是我的示例 class。如您所见,我定义了一个 class InnerClass
并在 main 方法中创建了它的一个实例。但是我没有使用正常的声明,而是使用基 class.
中不存在的方法声明了它的匿名内部 class
现在我知道如果我将在 InnerClass 中声明 helloWorld()
,那么我可以在通过匿名内部创建的实例上访问此方法 class。
但我想知道,是否可以在我的代码中不在基 class 中声明而调用此方法。我尝试探索反射 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());
}
}
}
getDeclaredMethod
检索可以用 invoke
:
执行的方法
Method method = inner.getClass().getDeclaredMethod("helloWorld");
method.invoke(inner);
下面的代码使用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[])
下面是我的示例 class。如您所见,我定义了一个 class InnerClass
并在 main 方法中创建了它的一个实例。但是我没有使用正常的声明,而是使用基 class.
现在我知道如果我将在 InnerClass 中声明 helloWorld()
,那么我可以在通过匿名内部创建的实例上访问此方法 class。
但我想知道,是否可以在我的代码中不在基 class 中声明而调用此方法。我尝试探索反射 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());
}
}
}
getDeclaredMethod
检索可以用 invoke
:
Method method = inner.getClass().getDeclaredMethod("helloWorld");
method.invoke(inner);
下面的代码使用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[])