类加载器与name-space

本文探讨了自定义类加载器的应用场景,并通过一个具体的例子展示了如何使用自定义类加载器来加载一个实现了单例模式的类。文章还讨论了在不同类加载器下运行时包访问权限的问题。

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

[color=red]学习自定义类加载器与运行时包:[/color]

package test;

import java.io.InputStream;

public class NewClassLoader extends ClassLoader {
public MySingleton createNewOne() throws Exception {
InputStream is = getClass().getResourceAsStream("MySingletonImp.class");
byte[] b = new byte[is.available()];
is.read(b);
Class clz = defineClass(null, b, 0, b.length);
Object o = clz.newInstance();
return (MySingleton) o;
}

public static void main(String[] args) throws Exception {
NewClassLoader loader = new NewClassLoader();
MySingleton newObj = loader.createNewOne();
MySingletonImp instance = MySingletonImp.getInstance();
System.out.println(MySingletonImp.class.getClassLoader());
System.out.println(instance == newObj);
}
}

class MySingletonImp implements MySingleton {
private static final MySingletonImp instance = new MySingletonImp();

public static MySingletonImp getInstance() {
return instance;
}
}

以上两个类是放在同一个文件下面

package test;

public interface MySingleton {

}

接口MySingleton 单独放在一个文件下面,此时执行mian方法,则抛异常:
[color=red]Exception in thread "main" java.lang.IllegalAccessException: Class test.NewClassLoader can not access a member of class test.MySingletonImp with modifiers ""[/color]如果把 MySingletonImp 类提出来单独放一个文件

package test;

public class MySingletonImp implements MySingleton {
private static final MySingletonImp instance = new MySingletonImp();

public static MySingletonImp getInstance() {
return instance;
}
}

则执行不会抛异常,输出 false
baidu描述原因:
Java语言中的包访问成员(friendly)实际上指的是运行时包访问可见,而不是编译时。因此当你试图访问不在同一个runtime package的成员是(即便在编译时它们在同一个包内,但是却由不同的class loader加载)也同样会得到[color=red]java.lang.IllegalAccessException: Class A can not access a member of class B with modifiers "" [/color]这样的异常。

但是本人还是不是很理解,我把MySingletonImp 单独提出来时,也不是同一个 runtime package,因为加载器都不一样,NewClassLoader 是系统类加载器加载的,而MySingletonImp 是自定义加载器加载的。。很是不明白,
欢迎大家讨论...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值