反射

概述

CLass类以及获取方法

类加载器ClassLoader

反射创建运行的类、获取属性与构造方法、

反射应用:动态代理、AOP

概述

反射就是在运行时动态的获取类的属性和方法并调用

CLass类以及获取方法

Class类

任何语言使用其编译器把程序代码编译(javac.exe)成Class文件,然后通过类加载器(java.exe)加载Class文件到内存(堆内存?)中,这个运行时类就是一个Class的实例,最后通过字节码执行引擎来对方法调用与字节码执行。

特点

  • 每一个运行类只加载一次
  • 有了Class类实例,可以进行以下操作
    • 创建对应的运行类的对象
    • 获取对应的运行类的完整结构
    • 调用对应的运行时类的指定的结构
    • 反射应用:动态代理

Class获取方法

  • 调用类本身的.class属性
1
Class clazz =  Persion.class;
  • 运行时类的对象获取
1
2
Persion p = new Persion();
Class clazz = p.getClass();
  • 通过Class的静态方法获取(反射的动态性)
1
2
3
String className = "com.cwm.Persion";
Class clazz = Class.forName(className);
//执行初始化静态代码块
  • 通过类加载器
1
2
3
ClassLoader classLoader = this.getClass().getClassLoader();
Class clazz = classLoader.loadClass(className);
//类还没有链接

加载,链接、初始化

类加载器ClassLoader

Class类实例操作

创建运行时类对象

1
clazz.newInstance();

获取运行类完整结构

属性

方法

构造器

内部类

父类

所在包

注解

异常

调用运行类指定结构

反射应用:动态代理、AOP

动态代理

AOP

Invoke深度解析

人吧

缺点

  • 消耗系统资源,什么资源?
  • 反射调用方法会忽略权限检查,破坏封装性

参考文献