反射

198 阅读2分钟

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行的代码调试都可能会让程序员遇到很多挫折,所以,面对挫折,我们永远不能低头。