概述
CLass类以及获取方法
类加载器ClassLoader
反射创建运行的类、获取属性与构造方法、
反射应用:动态代理、AOP
概述
反射就是在运行时动态的获取类的属性和方法并调用
CLass类以及获取方法
Class类
任何语言使用其编译器把程序代码编译(javac.exe)成Class文件,然后通过类加载器(java.exe)加载Class文件到内存(堆内存?)中,这个运行时类就是一个Class的实例,最后通过字节码执行引擎来对方法调用与字节码执行。
特点
- 每一个运行类只加载一次
- 有了Class类实例,可以进行以下操作
- 创建对应的运行类的对象
- 获取对应的运行类的完整结构
- 调用对应的运行时类的指定的结构
- 反射应用:动态代理
Class获取方法
- 调用类本身的.class属性
1 | Class clazz = Persion.class; |
- 运行时类的对象获取
1 | Persion p = new Persion(); |
- 通过Class的静态方法获取(反射的动态性)
1 | String className = "com.cwm.Persion"; |
- 通过类加载器
1 | ClassLoader classLoader = this.getClass().getClassLoader(); |
加载,链接、初始化
类加载器ClassLoader
Class类实例操作
创建运行时类对象
1 | clazz.newInstance(); |
获取运行类完整结构
属性
方法
构造器
内部类
父类
所在包
注解
异常
调用运行类指定结构
反射应用:动态代理、AOP
动态代理
AOP
Invoke深度解析
人吧
缺点
- 消耗系统资源,什么资源?
- 反射调用方法会忽略权限检查,破坏封装性
参考文献