1、啥是反射?
反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。
2、获取类(Class)对象的方法
通过forName() -> 示例:Class.forName("PeopleImpl")
通过getClass() -> 示例:new PeopleImpl().getClass()
直接获取.class -> 示例:PeopleImpl.class
3、类的常用方法
getName():获取类完整方法;
getSuperclass():获取类的父类;
newInstance():创建实例对象;
getFields():获取当前类和父类的public修饰的所有属性;
getDeclaredFields():获取当前类(不包含父类)的声明的所有属性;
getMethod():获取当前类和父类的public修饰的所有方法;
getDeclaredMethods():获取当前类(不包含父类)的声明的所有方法;
4、类的方法调用
4.1、静态(static)方法调用(使用 getMethod(xx) 获取到对应的方法,直接使用 invoke(xx)就可以了)
- 4.2、普通方法调用(getMethod 获取方法,可以声明需要传递的参数的类型。)
- 4.3、私有方法调用
5、关于跑用例出现的异常现象(java.lang.IllegalArgumentException: wrong number of arguments)
解决方法和说明:https://www.cnblogs.com/daimajun/p/6545533.html
6、总结
- 在反射中核心的方法是 newInstance() 获取类实例,getMethod(..) 获取方法,使用 invoke(..) 进行方法调用,通过 setAccessible 修改私有变量/方法的访问限制。
- 获取属性/方法的时候有无“Declared”的区别是,带有 Declared 修饰的方法或属性,可以获取本类的所有方法或属性(private 到 public),但不能获取到父类的任何信息;非 Declared 修饰的方法或属性,只能获取 public 修饰的方法或属性,并可以获取到父类的信息,比如 getMethod(..)和getDeclaredMethod(..)。
note:一个100行的代码调试都可能会让程序员遇到很多挫折,所以,面对挫折,我们永远不能低头。