Class.forName、initialize

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 看不到了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值