Class.forName 与ClassLoader.loadClass

Java 中动态加载类的两种方式 Class.forName 与ClassLoader.loadClass

先定义A类


package test;

public class A {
public void test() {
System.out.println("This is Class a Test");
}
}



然后是相关测试类


package test;

public class ClassLoadTest {

public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException {
ClassLoader classLoader = new ClassLoader() {
};

@SuppressWarnings("unchecked")
Class<A> clazz = (Class<A>) classLoader.loadClass("test.A");
A a = (A) clazz.newInstance();
a.test();

@SuppressWarnings("unchecked")
Class<A> clazz2 = (Class<A>) ClassLoader.getSystemClassLoader()
.loadClass("test.A");
A a2 = (A) clazz2.newInstance();
a2.test();

@SuppressWarnings("unchecked")
Class<A> clazz3 = (Class<A>) Class.forName("test.A");
A a3 = (A) clazz3.newInstance();
a3.test();

}

}



两者的区别:
Class.forName是从指定的classloader中装载类,如果没有指定,也就是一个参数的时候,是从装载当前对象实例所在的classloader中装载类.
而ClassLoader的实例调用loadclass方法,是指从当前ClassLoader实例中调用类,而这个实例与装载当前所在类实例的Classloader不是同一个.

举个例子吧, 有A,B,C 三个类 , 当前运行的类D的实例是d(装载它的是A) , 如果D中使用Class.forName那么就是使用的ClassLoader就是A,当然,也可以指定为B. 而如果D中代码使用的ClassLoader实例是C,那么就是用D来装载所指定的类.


如果在Class被载入的过程中,你希望使用在自己的Class Loader来实现特定的操作,请使用ClassLoader方式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值