gpt4 book ai didi

java - 在 Java 中,当方法具有基类作为参数时,使用反射调用方法无法找到方法

转载 作者:行者123 更新时间:2023-11-30 06:29:59 25 4
gpt4 key购买 nike

下面是代码片段,我正在尝试使用 REFLECTION 调用 usingClass 方法。当我传递一个 Child 类型的对象时,直接调用 usingClass() 方法(没有反射)有效,尽管当我尝试使用反射实现相同的事情时它抛出 NoSuchMethodFoundException。想知道我是否遗漏了什么或者这背后有什么逻辑吗?请帮忙

package Reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestMethodInvocation {

/**
* @param args
*/
public static void main(String[] args) {
TestMethodInvocation test = new TestMethodInvocation();
Child child = new Child();
Parent parent = (Parent)child;
Class<? extends Parent> argClassType = parent.getClass();
Class<? extends TestMethodInvocation> thisClassType = test.getClass();

test.usingClass(child);

Method methodToCall;
try {
methodToCall = thisClassType.getDeclaredMethod("usingClass", argClassType);
methodToCall.invoke(test, parent);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

private void usingClass(Parent p){
System.out.println("UsingClass: " + p.getClass());
}


}

输出如下。

UsingClass: class Reflection.Child
java.lang.NoSuchMethodException: Reflection.TestMethodInvocation.usingClass(Reflection.Child)
at java.lang.Class.getDeclaredMethod(Unknown Source)
at Reflection.TestMethodInvocation.main(TestMethodInvocation.java:20)

最佳答案

您的代码不起作用的原因是 getClass() 是动态绑定(bind)的。转换为 Parent 不会影响对象的运行时类型,因此变量 childparent 包含相同的类对象。除非您通过 getGenericSuperclass() 或类似的方式显式查询实例的父类,否则您将不得不使用 dystroy 提到的静态方式。

关于java - 在 Java 中,当方法具有基类作为参数时,使用反射调用方法无法找到方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10975472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com