重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
java 中如何实现一个类加载器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
成都网站设计、成都网站建设的关注点不是能为您做些什么网站,而是怎么做网站,有没有做好网站,给创新互联公司一个展示的机会来证明自己,这并不会花费您太多时间,或许会给您带来新的灵感和惊喜。面向用户友好,注重用户体验,一切以用户为中心。
class类文件只有通过类加载器加载后才能new出实例对象,因此不同类加载器中的对象和类都是不同的(即使类文件相同)。
java中的类加载器主要包括引导类加载器、扩展类加载器、系统类加载器以及自定义类加载器,并且各个类加载器之间按照树状层级(也称双亲委派)进行组合。引导类加载器负责加载lib目录中的类库并且该类加载器不能被java程序直接引用;扩展类加载器负责加载ext目录中类库但可被java程序直接引用,所有能被java程序直接引用的类加载器都继承于CLassLoader抽象类;系统类加载器负责加载由classpath指定的类库;自定义类加载器负责加载由用户指定路径的类库。
各个类加载器之间(除了引导类加载器)采用组合模式进行设计,所以一般在自定义类加载器时都需要指定一个父类加载器。这样设计的好处是避免同一类库的重复加载从而节约资源,并且当加载某个类文件时如果父加载器已经加载过就不会重复加载相同的类文件(类文件通过包名和类名进行唯一标识,如果不这样做,当用户写了一个java.lang.String类,就会使得已经写好的程序发生错乱,并且用户可以随机写一个与系统类相同的类文件进行恶意破坏)。
以下代码可对上述进行验证:
public class ClassLoaderTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(ClassLoaderTest.class.getClassLoader()); //1
System.out.println(ClassLoader.getSystemClassLoader()); //2
System.out.println(ClassLoaderTest.class.getClassLoader().getParent()); //3
System.out.println(ClassLoaderTest.class.getClassLoader().getParent().getParent()); //4
}
}
第1行和第2行代表系统类加载器,第3行代表扩展类加载器也是系统类加载器的父加载器,第4行是我们试图获取扩展类加载器的父加载器即引导类加载器但是返回的结果为空(印证了引导类加载器不能直接被java程序引用)。
看完上述内容,你们掌握java 中如何实现一个类加载器的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!