JAVA学习之反射——类加载

本文详细介绍了Java中类加载的过程,包括类加载的时机、类加载器的不同层次以及自定义类加载器的方法。通过示例解释了静态初始化的触发条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


类加载就是将类的class文件读入内存,并为之创建一个java.lang.Class对象。

1.类的初始化的时机

(1)创建类的实例:通过new操作符来创建实例,通过反射来创建实例,通过反序列创建。

(2)调用某个类的静态方法

(3)初始化某个类的子类,当初始化某个类的子类时,该子类的所有父类也同时会被初始化

需要注意的是:

对于final型的静态属性,如果该属性可以在编译时得到属性值,则可认为该属性是编译时属性,不会导致该类的初始化。例如:


class Tester 
{
	static{
		System.out.println("Tester类的静态初始化块);
	}
	static final String comileConstant="初始化";
}
public void TestCompileConstant{
	public static void main(String[] args){
		System.out.println(Tester.comileConstant);
	}
}

运行下面的程序,由于变量在编译时就被替换了,所以上面的程序并不能实现对Tester的初始化


反之,如果final类型的静态属性的值不能在编译时就确定,必须等到运行时才能确定。则将会导致该类被初始化。

class Tester 
{
	static{
		System.out.println("Tester类的静态初始化块);
	}
	static final String comileConstant=System.currentTimeMillis()+"";
}
public void TestCompileConstant{
	public static void main(String[] args){
		System.out.println(Tester.comileConstant);
	}
}



2.类加载器

类加载器有三个层次:Bootstrap ClassLoader根类加载器,Extension ClassLoader扩展类加载器,System ClassLoader系统类加载器

System ClassLoader:加载路径是程序运行的当前路径

Extension ClassLoader:一般在ext文件夹下C:\Program Files\Java\jre1.8.0_20\lib\ext;

Bootstrap ClassLoader:负责加载JAVA的核心类

3.自定义加载器

自定义加载器感觉比较复杂,所以就介绍几个重要的方法吧

(1)loadClass(String name,boolean resolve)该方法是ClassLoader的入口,根据指定的二进制名称加载类,系统就是调用该方法获取指定类的Class对象

(2)findClass(String name)根据二进制名称查找类

(3)Class defineClass(String name,byte[] b,int off,int len)该方法可以将指定类的字节码文件(即class文件)读入字节数组,并把它转化为Class对象

loadClass的执行步骤:

(1)用findLoaderClass()检查是否已经加载,如果已经加载则直接返回

(2)在父类加载器上调用loadClass方法,

(3)调用findClass来查找类

所以在自定义加载类时,一般都是重写findClass方法



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值