概述:在此阶段,主要对类变量的初始化
类的初始化步骤:
注意:在执行第2个步骤时,系统对直接父类的初始化步骤也遵循初始化步骤1-3
类的初始化时机:
Bootstrap class loader
:它是虚拟机的内置类加载器,通常表示为null,并且没有父类nullPlatform class loader
:平台类加载器可以看到所有平台类,平台类包括由平台类加载器或者祖先定义的Java SE平台API,其他实现类和JDK特定的运行时类System class loader
:它也被称为应用程序类加载器,与平台类加载器不同。系统类加载器通常用于定义应用程序类路径,模块路径和JDK特定工具上的类static ClassLoader getSystemClassLoader()
:返回用于委派的系统类加载器ClassLoader getParent()
:返回父类加载器进行委派当想要通过反射去使用一个类,首先需要获取到该类的字节码文件对象,也就是类型为Class类型的对象
Java提供了三种方式获取Class类型对象:
使用类的class属性来获取该类对应的Class对象
Class<类名> c = 类名.class;
调用对象的 getClass()
方法,返回该对象所属类对应的Class对象,该方法是Object类中的方法
Class<类名> c = new 类名().getClass();
使用Class类中的静态方法 forName(String className)
Class<类名> c = Class.forName(包名.类名);
// 该方法的字符串参数的值是某个类的全路径,即完整包名的路径
Class类中用于获取构造方法的方法:
Constructor<?>[] getConstructors()
:返回所有公共构造方法对象的数组Constructor<?>[] getDeclaredConstructors()
:返回所有构造方法对象的数组Constructor<?>[] getConstructor(Class<?>... parameterTypes)
:返回单个公共构造方法对象Constructor<?>[] getDeclaredConstructor(Class<?>... parameterTypes)
:返回单个构造方法对象注意:基本数据类型也可以通过 .class 得到对应的Class对象
Constructor类中用于创建对象的方法:
T newInstance(Object... initargs)
:根据指定的构造方法创建对象public void setAccessible(boolean flag)
:值为true时,取消访问权限检查(该方法用于使用私有构造方法创建对象)Class类中用于获取成员变量的方法:
Field[] getFields()
:返回所有公共成员变量对象的数组Field[] getDeclaredFields()
:返回所有成员变量对象的数组Field getField(String paraName)
:返回单个公共成员变量对象Field getDeclaredField(String paraName)
:返回单个成员变量对象File类中用于给成员变量赋值的方法:
void set(Object obj,Object value)
:给obj对象的成员变量赋值为valuepublic void setAccessible(boolean flag)
:值为true时,取消访问权限检查(该方法用于为私有成员变量赋值)Class类中用于获取成员方法的方法:
Method[] getMethods()
:返回所有公共成员方法对象的数组,包括继承的Method[] getDeclaredMethods()
:返回所有成员方法对象的数组,不包括继承的Method getMethod(String name,Class<?>... parameterTypes)
:返回单个公共成员方法对象Method getDeclaredMethod(String name,Class<?>... parameterTypes)
:返回单个成员方法对象Method类中用于调用成员方法的方法
Object invoke(Object obj,Object... args)
:调用obj对象的成员方法,参数是args,返回值是Object类型public void setAccessible(boolean flag)
:值为true时,取消访问权限检查(该方法用于调用私有成员方法)// 创建一个ArrayList对象
ArrayList<Integer> arr = new ArrayList<>();
// 获取arr对应的二进制字节码对象
Class<?> c = arr.getClass();
// 获取成员方法add
Method addMethod = c.getMethod("add",Object.class);
// 调用成员方法add
addMethod.invoke(arr,"hello");
addMethod.invoke(arr,"world");
// 遍历时需要按照Object类型进行输出
for (Object i : arr){
System.out.println(i);
}