# 什么是反射?
在运行中,对于任何一个类,能够知道它的所有属性和方法;对于任何一个对象,能够调用它的属性和方法。 这样能够根据字节码文件获取类信息、字段信息、方法信息等内容,创建实例调用方法的技术。 将字节码中的方法、变量、构造函数等映射出相应的Method、Filed、Construct等类,这些类提供了丰富的方法供我们使用 JVM在运行时才动态加载类或调用方法、访问属性,不需要在事先(编译期)知道运行的对象是什么类型
# 提供的功能
- 判断实例对象所属的类
类对象.isInstance(实例对象)
- 判断类所具有的成员变量和方法
- 构造一个类的对象
1. 对象的getClass()
2. 类名.class
3. Class.forName("类的路径");
- 调用对象的方法
# 创建类的实例化对象
类对象.newInstance();
# 反射的基石
字节码文件对象,即Class类的对象
# 字节码文件对象的三种获取方式
# mybatis如何将SQL执行结果封装为目标对象并返回的?
<resultMap>
标签- SQL语句中起别名 mybatis通过反射创建对象,通过反射给对象的属性逐一赋值并返回
# 哪里用到反射?
- 框架用的最多的就是反射,如Spring注入属性
- 加载驱动 (jdbc)
- Web服务器中利用反射调用了Sevlet的服务方法
- 获取配置文件
- IDEA等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法
Spring的IOC实现原理就是工厂模式+反射机制 AOP的动态代理
# 优缺点
优点:动态加载类,提高代码灵活度 缺点:运行速度比直接操作java代码要慢,能直接操作改变类的属性,有安全隐患
# 反射中Class.forName()和classLoader的区别
Class.forName()除了将.class文件加载到JVM中,还会对文件进行解释,执行类中的static块