反射
一、类的加载
当程序要使用某个类时,如果该类还未加载到内存中,则系统会通过加载、连接、初始化三步来实现对该类进行初始化。
1、加载
将class文件读入内存,并为之创建一个class对象。任何类使用时系统都会创建一个class对象。
2、连接
验证:是否有正确的内部结构,并和其他类协调一致
准备:负责为类的静态成员分配内存,并设置默认初始化值
解析:将类的二进制数据中的符号引用替换为直接引用
3、初始化
new创建对象时的初始化过程
二、类初始化时机
1、创建类的实例
2、类的静态变量,或者为静态变量赋值
3、类的静态方法
4、使用反射方式来强制创建某个类或者接口对应的java.lang.Class对象
5、初始化某个类的子类
6、直接使用java.exe命令来运行某个主类
三、类加载器
将.class文件加载到内存中,并为之创建class文件对象
四、类加载器的组成
1、Bootstrap ClassLoader 根类加载器
也被称为引导类加载器,负责java核心类的加载
比如System、String等,在JDK中JRE的lib目录下rt.jar文件中
2、Extension ClassLoader 扩展类加载器
负责JRE的扩展目录中的jar包的加载,在JDK中JRE的lib目录下的ext目录
3、System ClassLoader 系统类加载器
负责Jvm启动时加载来自java命令的class文件,一集classpath环境变量所指定的jar包和路径
五、Class类
获取class对象的三种方式:
1、Object类的getClass()方法
2、通过 类名.class 获得
3、通过Class类的静态方法forName(String className)(注:className必须是全类名)
六、反射通过配置文件运行的步骤
运行的类名和方法名,以键值对的形式,写在文本中
运行哪个类,读取配置文件即可
实现步骤:
1、准备配置文件,键值对
2、IO流读取配置文件 Reader
3、文件中的键值对存储到集合中 Properties
集合保存的键值对,就是类名和方法名
4、反射获取指定类的class文件对象
5、class文件对象,获取指定的方法(getMethod())
6、运行指定方法(invoke())
public static void main(String[] args) throws Exception{ //IO流读取配置文件 FileReader fr = new FileReader("config.properties"); //创建集合对象 Properties prop = new Properties(); //传递流对象 prop.load(fr); //关闭流 fr.close(); //通过键获取值 String className = prop.getProperty("className"); String methodName = prop.getProperty("methodName"); //通过反射获取指定类的class对象 Class clazz = Class.forName(className); //获取指定的方法名 Method method = clazz.getMethod(methodName,null); //调用方法 method.invoke(method,null); }