Java 反射
我在很久之前写过一次,也都是从网上搬运的知识,这段时间一直在学python,其他的知识就会有遗忘,我再复习一遍。
一. 反射的基本概念
使用反射机制可以构造类对象,动态获取当前class的信息 比如方法的信息、注解信息、方法的参数、属性等;
二. 实现反射相关的类库
java.lang.reflect
Construct Field Method 分别获取类的构造方法 成员变量 方法信息
三. 反射技术应用的场景
1 2 3 4 5 6 7 8 9 | 1.JDBC 加载驱动连接 class .forname 时运用到了反射技术 2.Spring 框架I用反射来实例化对象 3. 自定义注解生效(反射 + AOP) 4. 第三方核心的框架 5. 动态代理的场景中,使用到你跟他生成的代理类来提升代码的复用性 |
四. 反射的优点
1 2 3 4 5 | 增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作 提高代码的复用率,比如动态代理,就是用到了反射来实现 可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射动态调用 |
五. 反射的缺点
反射会涉及到动态类型的解析,所以JVM无法对这些代码进行优化,导致性能要比非反射调用更低。
使用反射以后代码的可读性会下降
放射可以绕过一些限制访问的属性或者方法,可能会导致破坏了代码本身的抽象性。
六. 程序运行过程的对比
1 2 3 4 5 6 7 | Java程序的运行过程: Person.java - > 编译器 - > Persion. class - > Java虚拟机 - >运行程序 Person = new Person() 虚拟机在执行的时候已经确切知道要实例化哪个类的对象 |
1 2 3 4 5 6 7 8 9 10 11 12 13 | 使用Java反射后程序运行的过程: Java反射? - > 编译器 < = > 运行程序 虚拟机在实例化对象的时候,可以事先不知道要实例化哪个类的对象,传参的时候虚拟机根据参数确定要实例化哪个类的对象;根据参数不同,虚拟机可以实例化任意类型对象。 Class clz = Class.forName( "persionPackage.Persion" ); Object obj = clz.newInstance(); 执行Class.forName的时候,类加载器会根据参数persionPackage.Persion去找这个类,把这个类加载到Java虚拟机,同时获取这个类的Class对象,每个类都有Class类型的对象, 这个对象保存了对应对象的元信息(属性,方法,构造函数)接下来再调用newInstance方法来实例化对象 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2019-03-27 了解一下UTF-16
2019-03-27 Unicode字符需要几个字节来存储?
2019-03-27 查看完整的 Unicode 字符集
2018-03-27 Python:在windows下创建虚拟环境
2018-03-27 Scrapy是什么