第一次接触反射,可能不好理解,但还是得先说一些抽象的概念。
反射是在类运行的时候动态的获取类或对象的信息
提一嘴RTTI,做个对比,可能有助于理解反射
- RTTI是在编译时打开和检查.class文件
- 反射是在运行时打开和检查.class文件
Class类与java.lang.reflect类库一起对反射进行了支持
再来,明确一些相关概念。
- 类对象:记录类的信息的对象,Class类的对象(每加载一个类就会产生一个类对象)
- 类的对象:一个类的某一个具体实例
Class类模板
获取类对象的三种方式:
- 类名.class()
- 对象名.getClass()
- Class.forName("fullPath"):通过类名获取类对象
方法
- getName():获取类的全路径
- getSimpleName():获取类名
- getPackage().getName():获取包名
- getSuperclass().getName():获取此类的父类的全名
- getInterfaces():获取此类直接实现的接口,返回Class集合
java.lang.reflect
1)属性对象 Field
Field[] getFields():获得本类及父类所有公开属性
Field[] getDeclaredFields():获得本类的所有属性
Field getField(String name):通过属性名获得本类或父类的此公开属性,返回此属性全路径
Field getDeclaredField(String name):通过属性名获得本类的此属性,返回此属性全路径
2) 方法对象 Method
Method[] getMethods():获得本类及父类所有公开方法
Method[] getDeclaredMethods():获得本类的所有方法
Method getMethod(String name):通过方法名获得本类或父类此公开属性,返回此方法全路径
Method getDeclaredMethod(String name):通过方法名获得本类的此属性,返回此方法全路径
3) 构造方法对象 Constructor
Constructor[] getConstructors():获得本类及父类的公开构造方法
Constructor[] getDeclaredConstructors():获得本类的所有构造方法
Constructor getDeclaredConstructor(参数类型顺序):获得对应参数的构造方法
Constructor getDeclaredConstructor():获得无参的构造方法
其他实用方法:
类对象.newInstance():通过类对象创建类的对象
Method类型的方法.invoke(对象,调用此方法要传的参数):返回值为Object
属性.set(对象,值)
setAccessible(true):设置为可访问,访问私有属性和方法