反射

2020/10/1 tag1

# 什么是反射?

在运行中,对于任何一个类,能够知道它的所有属性和方法;对于任何一个对象,能够调用它的属性和方法。 这样能够根据字节码文件获取类信息、字段信息、方法信息等内容,创建实例调用方法的技术。 将字节码中的方法、变量、构造函数等映射出相应的Method、Filed、Construct等类,这些类提供了丰富的方法供我们使用 JVM在运行时才动态加载类或调用方法、访问属性,不需要在事先(编译期)知道运行的对象是什么类型

# 提供的功能

  1. 判断实例对象所属的类
类对象.isInstance(实例对象)
  1. 判断类所具有的成员变量和方法
  2. 构造一个类的对象
1. 对象的getClass()
2. 类名.class
3. Class.forName("类的路径");
  1. 调用对象的方法

# 创建类的实例化对象

类对象.newInstance();

# 反射的基石

字节码文件对象,即Class类的对象

# 字节码文件对象的三种获取方式

# mybatis如何将SQL执行结果封装为目标对象并返回的?

  1. <resultMap>标签
  2. SQL语句中起别名 mybatis通过反射创建对象,通过反射给对象的属性逐一赋值并返回

# 哪里用到反射?

  1. 框架用的最多的就是反射,如Spring注入属性
  2. 加载驱动 (jdbc)
  3. Web服务器中利用反射调用了Sevlet的服务方法
  4. 获取配置文件
  5. IDEA等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法

Spring的IOC实现原理就是工厂模式+反射机制 AOP的动态代理

# 优缺点

优点:动态加载类,提高代码灵活度 缺点:运行速度比直接操作java代码要慢,能直接操作改变类的属性,有安全隐患

# 反射中Class.forName()和classLoader的区别

Class.forName()除了将.class文件加载到JVM中,还会对文件进行解释,执行类中的static块

Last Updated: 4/4/2024