JVM通过类的加载,类的连接,类的初始化对类进行初始化
类的加载:class文件读入内存,创建java.lang.Class对象
验证:检验类
准备:分配内存,设置默认初始化值
解析:二进制数据中的符号引用替换为直接引用
对类变量进行初始化
类没被加载或连接 --> 先加载并连接
父类为初始化 --> 初始化直接父类(最先初始化Object类)
类中有初始化语句 --> 执行初始化语句
将.class加载到内存,生成java.lang.Class对象
全盘负责:加载类及其相关类
父类委托:让父类加载器加载
缓存机制:用过的类有缓存
Bootstrap class loader:内置类加载器,通常表示为null
Platform class loader:平台类加载器,加载api、运行时类
System class loader:应用程序类加载器,定义应用程序路径、模块路径
static classLoader getSystemClassLoader()
:返回用于委派的系统类加载器ClassLoader getParent()
:返回父类加载器进行委派通过类加载器加载的.class文件对象的Class类进行调用
反射是框架设计的灵魂
框架:半成品软件。可以在框架基础上进行软件开发,简化编码
将类的各个组成部分封装成其他对象
Source源代码阶段:Class.forName("包名.类名");
Class类的静态方法
将字节码文件加载进内存,返回class对象
Class类对象阶段:类名.class
通过类名的属性返回class对象
Runtime运行阶段:对象.getClass()
定义在Object类中
同一个字节码文件(*.class)在一次程序运行中只会加载一次
Field[] getFields() //获取所有public修饰成员
File getField(String name) //获取指定名称public修饰成员
Field[] getDeclaredFields() //获取所有的成员
File getDeclaredField(String name) //获取指定名称的成员
Field成员变量:
void set(Object obj, Object value)
get(Object obj)
暴力反射(忽略权限修饰符的安全检查):变量对象.setAccessible(true);
Constructor<?>[] getConstructor()
Constructor<T> getConstructor(类<?>... parameterTypes) //指定构造方法的参数 String.class int.class ...
Constructor<?>[] getDeclaredConstructor()
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
Constructor构造方法:Object obj = 构造方法对象.newInstance(构造)
Method[] getMethods()
Method getMethods(String name, 类<?>... parameterTypes
Method[] getDeclaredMethods()
Method getDeclaredMethods(String name, 类<?>... parameterTypes)
Method方法对象:
方法对象.invoke(Object obj, Object...args);
String getname()
String getName()
List<Integer> list = new ArrayList<>();
list.add(123);
Method m = list.getClass().getMethod("add", Object.class);
m.invoke(list,"hello");
System.out.println(list);
className=...
methodName=...
Properties prop = new Properties();
prop.load(new FileReader("xxx.txt"));
Class<?> c = Class.forName(prop.getProperty("className"));
Method m =c.getMethod(prop.getProperty("methodName"));
Object obj = c.newInstance();
m.invoke(obj);
Java9推出模块化
module-info.java
的描述文件exports 包名;
requires 包名;
描述文件:provides 接口名 with 实现类
1、描述文件:uses 接口名
2、加载服务:ServiceLoader<接口名> 变量名 = ServiceLoader.Load(导出模块名.class);
3、遍历服务:
for(接口名 变量名2 : 变量名){
变量名2.接口内的方法(); // 实现其模块实现类的方法
}