从头认识java-12.2 Class对象(3)-.class

本文详细探讨了在Java中获取Class对象的不同方式及其区别,重点分析了使用.class和Class.forName方法的不同之处,包括类的加载、链接和初始化过程。

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

这一章节我们来讨论一下得到Class对象的另一种方式.class。

1.例子

package com.ray.ch12;

public class Test {
	public static void main(String[] args) {
		System.out.println(Person.class.getName());
	}
}

class Person {
	static {
		System.out.println("loading person");
	}

	public Person() {
		System.out.println("creating person");
	}
}


输出:

com.ray.ch12.Person

通过这种方式一样可以得到Person类的Class对象的引用,但是从输出我们观察到,在得到引用的同时,Person是没有加载到类加载器里面。

其实,初始化类包含三个步骤:

(1)加载。找到.class文件,加载到类加载器里面

(2)链接。为静态属性或者方法分配空间。

(3)初始化。初始化静态属性或者方法,如果有父类,则需要初始化父类。

初始化是在静态方法或者非静态域进行首次引用时才执行。

由于上面的代码还没有执行到初始化这一步,因此,是不会有loading等信息的打印。

结论:使用.class只会得到Class的引用,而Class.forName除了得到引用,还进行了初始化。

package com.ray.ch12;

public class Test {
	public static void main(String[] args) {
		Class personClass = Person.class;
		System.out.println(Person.id);
		try {
			Class personClass2=Class.forName("com.ray.ch12.Person");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

class Person {
	public final static int id = 1;
	static {
		System.out.println("loading person");
	}

	public Person() {
		System.out.println("creating person");
	}
}


输出:

1
loading person

总结:这一章节结束了.class的使用以及跟Class.forName的区别。

这一章节就到这里,谢谢。

-----------------------------------

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值