反射(三)获取元素

86 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

获取类

反射技术的第一步是先得到 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 对象名