Java面试问题之十四

请阐述一下不同类加载器加载的类之间的可见性。

答:不同类加载器的命名空间存在以下关系:
(1)同一命名空间内的类是相互可见的。
[color=red] [b](2)子加载器的命名空间包含所有父加载器的命名空间。因此由子加载器加载的类能看见
其父加载器加载的类。比如,系统类加载器加载的类能够看见根类加载器加载的类。[/b][/color]
[color=green] [b](3)由父加载器加载的类不能看见子加载器加载的类。[/b][/color]
(4)如果两个加载器之间没有直接或间接的父子关系,那么它们各自加载的类相互是不可
见的。

比如,我现在定义了一个加载器类MyClassLoader,这个类是继承自java.lang.ClassLoader类。MyClassLoader的一个对象为loader1,则下面代码会抛出java.lang.NoClassDefFoundError。


public static void main(String[] args){
MyClassLoader loader1=new MyClassLoader("loader1");
loader1.setPath("D:\\Java\\Program\\Exercises");

Class objClass=loader1.loadClass("Sample");
Object obj=objClass.newInstance();
Sample sample=(Sample)obj; //这句将抛出NoClassDefFoundError错误!
System.out.println(sample.v1);
}


问题分析:由于MyClassLoader类是由系统类加载器加载的,而Sample类则是由loader1类加载的,因此MyClassLoader类是看不见Sample类的。因此,在MyClassLoader类的main()方法中使用Sample类,会导致NoClassDefFoundError错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值