前因
碰到有人问这样一个问题:
请教一下,为什么我的这个代码只有在添加一个无参的构造方法之后才能正确运行,注释掉就会报这个错误
然而另一个人写的反射却没报错
经过我用我的代码复现,发现有点意思。
问题代码
JAVA
public class TestClass {
public static void main(String[] args) {
Class c = null;
try {
// c = Class.forName("chapter5_1.method.Test");
c = Test.class;
//调用成员方法
Constructor cs = c.getConstructor();
// Object obj = cs.newInstance();
// System.out.println("obj:" + obj);
//add
Method m = c.getDeclaredMethod("add", int.class,int.class);
int result1 = (int) m.invoke(c, 10,20);
System.out.println("加法结果:" + result1);
//sub
m = c.getDeclaredMethod("sub", int.class,int.class);
int result2 = (int) m.invoke(c, 10,20);
System.out.println("减法结果:" + result2);
//mul
m = c.getDeclaredMethod("mul", int.class,int.class);
int result3 = (int) m.invoke(c, 10,20);
System.out.println("乘法结果:" + result3);
//div
m = c.getDeclaredMethod("div", int.class,int.class);
double result4 = (double) m.invoke(c, 10,20);
System.out.println("除法结果:" + result4);
} catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
利用反射调用Test 类 的加减乘除方法
运行报错:
AUTO
Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at chapter5_1.method.TestClass.main(TestClass.java:19)在Java中,当你遇到“object is not an instance of declaring class”这样的错误时,这通常意味着你正在尝试在一个对象的上下文中调用一个方法或访问一个字段,但这个对象并不是该方法或字段所声明的类的实例。这种情况经常发生在反射操作中,尤其是当你错误地传递了对象实例或者方法/字段所属的类时。
解决思路
一步一步排除问题:
1.改变动态加载类的方法:没用依旧报错

2.改变invoke方法调用的反射对象:成功


总结
在Java反射中,Method.invoke()方法的第一个参数必须是一个对象实例,该实例是你要调用其方法的类的实例。
不能将Class对象(例子中是c)传递给invoke()方法作为第一个参数,因为Class对象本身并不代表该类的任何具体实例。
解决方法:
通过反射拿到对象的构造方法来构造实例对象才能继续运行其他方法
需要先获取该类的构造方法,并使用它来创建该类的一个实例对象。这是因为非静态方法是与类的实例相关联的,而不是与类本身相关联。
本文是原创文章,采用 CC BY-NC-SA 4.0 协议,完整转载请注明来自 上玄
评论
隐私政策
0/500
滚动到此处加载评论...



