Java反射

简介

  • 反射是指对于任何一个 Class 类,在“运行的时候”都可以直接得到这个类全部成分。
  • 在运行时,可以直接得到这个类的构造器对象:Constructor
  • 在运行时,可以直接得到这个类的成员变量对象:Field
  • 在运行时,可以直接得到这个类的成员方法对象:Method
  • 这种运行时动态获取类信息以及动态调用类中成分的能力称为 Java 语言的反射机制。

反射的关键:
反射的第一步都是先得到编译后的 Class 类对象,然后就可以得到 Class 的全部成分。
image.png

只需要先获得它内存中已编译好的 class 文件,然后就可以获得它这个类中的所有东西了

总结

  1. 反射可以破坏封装性,私有的也可以执行了

获取类对象

  1. Class c1 = Class.forName("全类名");(好像已经弃用了)
  2. Class c2 = 类名.class
  3. Class c3 = 对象.getClass();

构造器

获取构造器对象

image.png
后面两个可以指定构造器的形参类型 然后获取指定的构造器,传入如:Integer.class

创建对象和暴力反射

image.png
暴力反射的话,它可以绕过 非public 的权限,也可以去获取到那些 非public 的资源

成员变量

获取

image.png

赋值

image.png

成员方法

获取

image.png

执行

image.png

泛型擦除

编译成 Class 文件进入运行阶段的时候,泛型会自动擦除
也就是说,在运行时,获取的泛型它实际上是没有的
例如:

ArrayList<Integer> lists = new ArrayList<>();
lists3.add(23);
lists3.add(22);
Class c = lists.getClass(); // ArrayList.class  ===> public boolean add(E e)
// 定位c类中的add方法
Method add = c.getDeclaredMethod("add", Object.class);
boolean rs = (boolean) add.invoke(lists, "黑马");
System.out.println(rs);

结果:
[23, 22, 黑马]

反射做框架

目前很多主流框架都会基于反射设计一些通用技术功能
例如:
给你任意一个对象,在不清楚对象字段的情况可以,可以把对象的字段名称和对应值存储到文件中去。
image.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值