java forname loader_java – Class.forName()vs ClassLoader.loadClass() –...

他们是完全不同的!

Returns the Class object associated with the class or interface with the given string name. Invoking this method is equivalent to: Class.forName(className, true, currentLoader)

(这里指的是你想要初始化类吗?)

Invoking this method is equivalent to invoking loadClass(name, false).

(这里,布尔值与初始化无关;但是如果检查loadClass(String,boolean)文档,你会看到它所做的只是加载类,而不是初始化它).

第一个(Class.forName(“SomeClass”);)将:

>使用加载调用此代码的类的类加载器

>初始化类(即,将运行所有静态初始化程序)

另一个(ClassLoader.getSystemClassLoader().loadClass(“SomeClass”);)将:

>使用“system”类加载器(which is overridable)

>不初始化类(例如,如果您使用它来加载JDBC驱动程序,它将不会被注册,并且您将无法使用JDBC!)

假设您正在编写将在Tomcat等容器上执行的Web应用程序. Tomcat所做的是为每个Web应用程序创建一个类加载器(以便以后可以卸载Web应用程序并释放内存 – 您需要一个专用的类加载器才能使用它!).在这种情况下,您可以看到两个调用都会产生完全不同的结果!

有关类加载和初始化的更详细(和权威)信息,请查看最新(第3版)Java语言规范的第12.2和12.4节.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值