Java反射踩坑记录

通过Method.invoke(Object)可以反射调用Object的方法,比如Object有个属性name,可以通过调用这个对象的getName()方法来获取具体的Value。
就是这么简单的流程,就踩到以下的坑。

java.lang.IllegalArgumentException: object is not an instance of declaring class

这个异常是由于invoke()传递的参数Object缺少实例而导致的,再反射调用时,传递的参数应该与调用的method保持类型一致,且为一个被初始化过的对象实例。
令:如果被调用的method是一个static的方法,则传递的Object参数可以不必初始化,即可以直接使用classType作为参数。

java.lang.NoSuchMethodException: com.github.hcsp.reflection.MapBeanConverter$DemoJavaBean.()

这个是由于在使用class..getConstructor().newInstance();进行初始化时,被调用的class不存在无参数的构造方法时引起的。
使用new关键字初始化的对象与使用class.getConstructor().newInstance();初始化的对象在本质上是相同的,但new可以显示的调用任意一个构造方法,而newInstance()只能调用无参数的构造方法,当被调用的class不存在无参数的构造方法时,会报上述错误。

Method.invoke()没有获取到预期中的对象

在使用反射调用方法获取对象的值时(getName()),反射调用的参数必须是原本的那个对象,不能是获取Class后,通过Class.getConstructor().newInstance()新构造的对象。因为想要获取的Value只存在于原本的那个对象中,新构造出来的对象不具有原本的属性值,是2个不同的对象。

getMethod()报错java.lang.NoSuchMethodException

在使用class.getMethod()找目前方法时,传参需要正确,不光是MethodName,还有parameterTypes,需要传递类型正确且个数正确的Class[],且基本类型int.class与包装类型Integer.class是不同的。