Java反射

1.反射

反射被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。

类加载是指:将类的class文件读入内存,并在堆内存中的方法区对应创建一个java.lang.Class对象,一个类只有一个Class对象,这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像是一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为反射。

在这里插入图片描述
类加载的几种来源

  • 从本地文件系统加载class文件,也就是本地代码

  • 从jar包中加载class文件,例如JDBC的数据库驱动包

  • 通过网络加载class文件,例如GitHub上的class文件

  • 把一个java源文件动态编译,并执行加载

类的加载过程:类加载器子系统

2.反射机制提供的功能

  • 在运行时判断任意一个对象所属的类

  • 在运行时构造任意一个类的对象

  • 在运行时判断任意一个类所具有的成员变量和方法

  • 在运行时获取泛型信息

  • 在运行时调用任意一个对象的成员变量和成员方法

  • 在运行时处理注解

  • 生成动态代理

3.Class类

Class类

反射的原理总结:

  1. 反射类及反射方法的获取,都是通过从列表中搜寻查找匹配的方法,所以查找性能会随着类的大小、方法的多少而变化

  2. 每个类都会有一个与之对应的Class实例,从而每个类都可以获取method反射方法,并作用到其他实例上

  3. 反射也是考虑了线程安全的

  4. 反射使用软引用relectionData缓存class信息,避免每次重新在jvm获取带来的开销

  5. 反射调用多次生成新代理Accessor,而通过字节码存储,则考虑了卸载的功能,所以会使用独立的类加载器

  6. 当找到需要的方法,都会copy一份出来,而不是使用原来的实例,从而保证数据隔离

  7. 调度反射方法,始终都是由jvm执行invoke0()

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carl·杰尼龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值