目录
引出反射机制编辑
介绍反射机制编辑
反射的优点和缺点 (反射调用优化 )编辑
Class类
class常用方法
编辑
编辑 获取class类对象的不同方式
哪些类型有class对象
编辑
类加载
编辑类加载流程图
类加载的五个阶段
编辑
通过反射获取类的结构信息 编辑
反射爆破创建实例编辑
反射爆破操作属性
反射爆破操作方法
引出反射机制
这里有一个需求, 根据配置文件的信息, 创建Cat对象并调用hi方法
先尝试不用反射用现有的技术看能否实现:
新建一个类, 创建一个properties文件, 里面有这两个内容: 类的全路径和方法名
新建一个文件所引用的那个cat类, 里面有hi方法
新建一个类, 用于尝试实现上面的要求
根据传统的方式, 我们想要创建Cat对象并调用hi方法需要new一个对象, 再去调用这个方法
我门用io流的Properties类来读出文件的内容
得到这个类的全路径名时可以这样创建对象
但是却没办法这样创建对象, 因为classfullpath是一个string类型,尽管它的值等价与上面的com.hspedu.Cat(), 但是它却不是一个类
使用反射解决, 通过加载类得到class类型的对象, 在通过class得到加载类的com.hspedu.Cat()实例
这里得到的o的运行类型就是cat
此时已经成功创建了cat对象了, 那么我们怎么得到它的hi方法呢? 传统的方式我们通过点出的方式得到得个hi方法, 但是这样处理有一个问题, 因为你是文件中读取的, 实际上你不知道你要调用的方法是hi方法, 也可能是其他的方法, 点的方式是只能你知道这个方法名的时候才能去选择点出哪一个方法
(改一下方法名)
所以我们通过反射这个方式, 通过方法名得到方法对象, 通过方法去点invoke对象得到方法, 正常是对象去点方法, 这里是方法对象去点invoke对象
有这样的方式很牛, 牛就牛在可以通过外部文件,在不修改源码的情况下, 来控制程序, 如果没有这个机制spring, mybatis都不存在, 是框架的灵魂
介绍反射机制
除上面引出用到方法其余的使用示例:
(类中有这两个构造器)
反射的优点和缺点 (反射调用优化 )
我们用传统的方法来调用hi测试它的耗时
用反射的方式来测试它的耗时
可以看到速度区别很大
反射适当调用优化
在写一个关闭了访问检查的反射方法测试耗时
Class类
class常用方法
获取class类对象的不同方式(☆☆☆重要)
计算机执行有三个阶段, 可以在不同阶段通过不同方法得到对应的类对象
哪些类型有class对象
类加载
类加载流程图
类加载的五个阶段
ClassLoad02:
通过反射获取类的结构信息
反射爆破创建实例
示例:
反射爆破操作属性
反射爆破操作方法