Java反射机制
class 类的创建方式
- 通过具体的类创建(这个方式最高效也最安全)
Class clazz = Person.class;
- 通过类的实例创建
Class clazz = person.getClass();
- 通过类的全名(有package)创建
Class clazz = Class.forName("com.learn.reflection.Person");
- 内置基本数据类型可以直接用类名.TYPE(Integer 等)
- 可以利用ClassLoader
什么时候会发生类的初始化
类的主动引用
- 当虚拟机启动,先初始化main方法所在的类
- new 一个类的对象
- 调用类的静态成员(除了final常量)和静态方法
- 使用java.lang.reflect 包的方法对类进行反射调用
- 当初始化一个类,如果气父类没有被初始化,则先要初始化他的父类。
类的被动引用(不会发生类的初始化)
- 当访问一个静态类时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化
- 通过数组定义类引用,不会触发此类的初始化
- 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中)
类加载–》 链接 --》 初始化
类加载器
获取系统类的加载器— 用户自定义的类
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
获取系统类加载器的父类加载器—扩展类加载器
ClassLoader parent = systemClassLoader.getParent();
获取扩展类的父类加载器— 根加载器(c/c++)—java.lang.*
ClassLoader parentx = parent.getParent();
获得系统类加载器可以加载的路径
System.getProperty("java.class.path");