反射机制
通过反射机制可以操作class字节码文件,可以读和修改,操作代码片段,位于java.lang.reflect.* 包下
主要类:
- java.lang.Class 字节码文件,表示类型
- java.lang.reflect.Method 字节码中的方法字节码
- java.lang.reflect.Constructor 字节码中的构造方法字节码
- java.lang.reflect.Field 字节码中的属性字节码
- 获取 class 的三种方式
1、Class c1 = Class.forName(“完整包名”); c1代表类这个类型;将类加载到程序中
可将包名配置到配置文件中,src为类的根目录,可获得文件的绝对路径:String path = Thread.currentThread().getContextClassLoader().getResource(“文件相对src路径”).getPath();将配置信息读取到properties集合中
2、每个类继承Object,都有getClass()方法,返回对象的类这个类型
3、java中任何类型,包括基本数据类型都有.class属性,例如
Class c = String.calss;
- 通过反射实例化对象
Object o = c.newInstance(); 使用方法创建实例,会调用类的无参构造方法
- 配置文件读取
1、通过properties集合读取
2、通过资源绑定器 java.util 中提供ResourceBundle,调用getBundle(“不带扩展名的文件路径名”)方法,只能绑定.properties文件
- 类加载器
专门负责加载类的命令/工具 ClassLoader
JDK 中自带三个类加载器,启动类加载器、扩展类加载器、应用类加载器
启动类加载器专门加载:jdk/jre/lib/rt.jar中的类文件
如果启动类加载不到,通过扩展类加载器加载,负责加载:jdk/jre/lib/ext/*.jar
如果前两个加载不到,则通过应用类加载器加载classpath中的jar包
双亲委派机制:安全机制,优先从启动类加载器中加载(父),再从扩展类加载器中加载(母),双亲委派。
- 获取Field
Class c = Class.forClass();
c.getFields() 只能反射获取public字段
c.getDeclaredFields() 可以获取所有字段,包括private
- 获取method
方法可变长度参数 fun(int… args)
使用 Method 类中的invoke 调用方法