这里写自定义目录标题
Class.forName
class.forName的加载
新建一个类
public class ClassForName {
//静态代码块
static {
System.out.println("静态代码块");
}
//静态变量
private static String staticFiled = staticMethod();
//赋值静态变量的静态方法
public static String staticMethod(){
System.out.println("静态方法");
return "给静态字段赋值";
}
public void print(){
System.out.println("ffff");
}
}
一个测试方法
Class clazz = Class.forName("xx.clazz.ClassForName",true,Thread.currentThread().getContextClassLoader());
因为initialize设置为true,因此会对加载的类进行初始化,执行类中的静态代码块,以及对静态变量的赋值等操作。打印
静态代码块
静态方法
Class clazz = Class.forName("xx.clazz.ClassForName",false,Thread.currentThread().getContextClassLoader());
ClassForName classForName = (ClassForName) clazz.newInstance();
因为initialize设置为false,因此第一句执行完不会进行初始化,只会加载类到**方法区 **。
当调用newInstance时,会在方法区中存储类的静态变量与final常量,并且在堆中初始化类的对象,类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构。
栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 。
加载类时放置静态
以及.class二进制 ------存放对堆区实例化对方的引用
方法区---------->堆区------------------>栈区
------------堆区存放Class对象
ClassLoader
ClassLoader.getSystemClassLoader().loadClass("xx.clazz.ClassForName")
与class.forName中initialize设置为false基本一致
ClassLoader.getSystemClassLoader().loadClass与class.forName具体加载方式最后都是private native 看不到了