您好,登录后才能下订单哦!
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 中如何实现一个类加载器的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。