JavaSE-反射

什么是反射

  • 反射允许对成员变量、成员方法、构造方法的信息进行编程访问
  • 说白了就是获取类中的成员变量、成员方法、构造方法的信息
  • 可以获取到
    • 字段(成员变量)
    • 成员方法
    • 构造方法
  • 可以解剖出
    • 修饰符
    • 名字
    • 类型
    • 值/赋值
    • 形参
    • 创建对象
    • 返回值
    • 抛出的异常
    • 注解
    • 运行获取到的方法

在反射面前,类的一切都是赤裸裸的展现在我们的眼前

获取

获取是从class字节码文件中获取的,所以要先学习获取字节码文件Class

获取Class对象

有三种方式对应三种阶段

  1. Class.forName(“全类名”)

    • 对应源代码阶段
    • 最为常用的一种方法
  2. 类名.class()

    • 对应加载阶段(内存)
    • 一般更多地作为参数传递
  3. 对象.getClass()

    • 对应运行阶段
    • 当已经有这个类的对象时,才可以使用

获取Class对象中的构造方法

构造方法有一个类来描述:Constructor

Constructor getConstructor(参数是类型的class,与目标构造函数保持一致)
Constructor getDeclaredConstructor(参数是类型的class,与目标构造函数保持一致)
Constructor[] getConstructors
Constructor[] getDeclaredConstructors

获取Class对象中的成员变量

成员变量有一个类来描述:Field

Field getField()
Field getDeclaredField()
Field[] getFields()
Field[] getDeclaredFields()

获取Class对象中的成员方法

成员方法有一个类来描述:Method

Method getMethod(“方法名”,参数类型.class…) - 获取单个公共方法
Method getDeclaredMethod(“方法名”,参数类型.class…) - 获取当个私有方法
Method[] getMethods() - 获取所有公共方法,包括从父类中继承下来的
Method[] getDeclaredMethods() - 获取所有当前子类的方法,不包括从父类中继承的,但可以获取私有方法

解剖

解剖构造方法

int getModifiers() - 获取构造方法修饰符
Parameter[] getParameters() - 获取构造方法参数列表
Object newInstance(初始化列表) - 使用该构造方法创建对象

解剖成员变量

int getModifiers() - 获取修饰符
String getName() - 获取变量名
Class getType() - 获取类型
Object get(对象名) - 获取变量记录的值
void set(对象名,新值) - 修改对象中目标成员变量的值

解剖成员方法

int getModifiers() - 获取方法权限修饰符
String getName() - 获取方法名
Class[] getParameterTypes() - 获取方法参数列表
Class getReturnType() - 获取方法返回值
Class[] getExceptionTypes() - 获取方法抛出的异常
Object invoke(对象名,方法实际参数…) - 运行方法

暴力反射

暴力体现在对类中私有化的属性进行临时访问

构造方法/成员变量/成员方法.setAccessible(true/false) 可以临时改变访问权限

比如我们原来私有的构造方法,临时改变访问权限为true后就可以使用私有化的构造方法进行实例化对象,成员变量和成员方法也一样

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值