获取类
反射技术的第一步是先得到 Class 类对象,有三种方式获取:
- 类名.class
- 类的对象.getClass()
- Class.forName("类的全限名"):
public static Class<?> forName(String className)
Class 类下的方法:
方法 | 作用 |
String getSimpleName() | 获得类名字符串:类名 |
String getName() | 获得类全名:包名+类名 |
T newInstance() | 创建 Class 对象关联类的对象,底层是调用无参数构造器,已经被淘汰 |
获取构造
获取构造器的 API:
- Constructor getConstructor(Class... parameterTypes):根据参数匹配获取某个构造器,只能拿 public 修饰的构造器
- Constructor getDeclaredConstructor(Class... parameterTypes):根据参数匹配获取某个构造器,只要申明就可以定位,不关心权限修饰符
- Constructor[] getConstructors():获取所有的构造器,只能拿 public 修饰的构造器
- Constructor[] getDeclaredConstructors():获取所有构造器,只要申明就可以定位,不关心权限修饰符
Constructor 的常用 API:
方法 | 作用 |
T newInstance(Object... initargs) | 创建对象,注入构造器需要的数据 |
void setAccessible(true) | 修改访问权限,true 攻破权限(暴力反射) |
String getName() | 以字符串形式返回此构造函数的名称 |
int getParameterCount() | 返回参数数量 |
Class<?>[] getParameterTypes | 返回参数类型数组 |
获取变量
获取 Field 成员变量 API:
- Field getField(String name):根据成员变量名获得对应 Field 对象,只能获得 public 修饰
- Field getDeclaredField(String name):根据成员变量名获得对应 Field 对象,所有申明的变量
- Field[] getFields():获得所有的成员变量对应的 Field 对象,只能获得 public 的
- Field[] getDeclaredFields():获得所有的成员变量对应的 Field 对象,只要申明了就可以得到
Field 的方法:给成员变量赋值和取值
方法 | 作用 |
void set(Object obj, Object value) | 给对象注入某个成员变量数据,obj 是对象,value 是值 |
Object get(Object obj) | 获取指定对象的成员变量的值,obj 是对象,没有对象为 null |
void setAccessible(true) | 暴力反射,设置为可以直接访问私有类型的属性 |
Class getType() | 获取属性的类型,返回 Class 对象 |
String getName() | 获取属性的名称 |
获取方法
获取 Method 方法 API:
- Method getMethod(String name,Class...args):根据方法名和参数类型获得方法对象,public 修饰
- Method getDeclaredMethod(String name,Class...args):根据方法名和参数类型获得方法对象,包括 private
- Method[] getMethods():获得类中的所有成员方法对象返回数组,只能获得 public 修饰且包含父类的
- Method[] getDeclaredMethods():获得类中的所有成员方法对象,返回数组,只获得本类申明的方法
Method 常用 API:
- public Object invoke(Object obj, Object... args):使用指定的参数调用由此方法对象,obj 对象名