Java自定义类加载器的父加载器问题
先看一句书上的原话:
对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的
父类加载器是引导类加载器;对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器 Java 类
的类加载器。
针对自定义的类加载器:我的理解是一般自定义加载器的父加载器都是系统类加载器,但如果一个自定义的类加载器是由另一个自定义的类加载器加载的,那么这个自定义的类加载器的父加载器就是那个另一个自定义的类加载器。
但是在看代码:
控制台输出结果

FileSystemClassLoader 是一个自定义的类加载器,通过这个类在将这个类加载器的在加载到内存中,可以看到是通过.findClass方法直接定义加载,并非用的loadClass,所以不存在向上委托。通过第一条语句的输出结果可以看出 test是由FileSystemClassLoader加载器加载的。
然后在通过反射创建一个该类加载器的实例,输出的父加载器还是系统类加载器。
到这里我就不明白了,不知道是我理解有错,还是分析的有问题,希望高手能解答下疑惑
另外还补充问一下:
ClassLoader cla= (ClassLoader) con.newInstance(b);
关于这句 在这个代码中如果换成
FileSystemClassLoader cla= (FileSystemClassLoader) con.newInstance(b);
会报错
java.lang.ClassCastException: com.test.FileSystemClassLoader cannot be cast to com.test.FileSystemClassLoader
我也不是很明白为什么转成父类就不报错,而转成自己本身的类就报错
我也明白是因为类加载器不通引起的,但是父类ClassLoader 的加载器也不同啊,为什么不会报这个错呢。
对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的
父类加载器是引导类加载器;对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器 Java 类
的类加载器。
针对自定义的类加载器:我的理解是一般自定义加载器的父加载器都是系统类加载器,但如果一个自定义的类加载器是由另一个自定义的类加载器加载的,那么这个自定义的类加载器的父加载器就是那个另一个自定义的类加载器。
但是在看代码:
FileSystemClassLoader fsc=new FileSystemClassLoader("F:\\project\\eclipsespaces\\test\\bin");
Class test=fsc.findClass("com.test.FileSystemClassLoader");
Class[] a={String.class};
String [] b={""};
Constructor con=test.getConstructor(a);
ClassLoader cla= (ClassLoader) con.newInstance(b);
System.out.println(test.getClassLoader());
System.out.println(cla.getParent());控制台输出结果

FileSystemClassLoader 是一个自定义的类加载器,通过这个类在将这个类加载器的在加载到内存中,可以看到是通过.findClass方法直接定义加载,并非用的loadClass,所以不存在向上委托。通过第一条语句的输出结果可以看出 test是由FileSystemClassLoader加载器加载的。
然后在通过反射创建一个该类加载器的实例,输出的父加载器还是系统类加载器。
到这里我就不明白了,不知道是我理解有错,还是分析的有问题,希望高手能解答下疑惑
另外还补充问一下:
ClassLoader cla= (ClassLoader) con.newInstance(b);
关于这句 在这个代码中如果换成
FileSystemClassLoader cla= (FileSystemClassLoader) con.newInstance(b);
会报错
java.lang.ClassCastException: com.test.FileSystemClassLoader cannot be cast to com.test.FileSystemClassLoader
我也不是很明白为什么转成父类就不报错,而转成自己本身的类就报错
我也明白是因为类加载器不通引起的,但是父类ClassLoader 的加载器也不同啊,为什么不会报这个错呢。
...全文
相关推荐
自定义类加载器
当一个类加载器接收到加载类的请求时,它首先会委托其父加载器尝试加载,只有当父加载器无法找到对应的类时,才会尝试自己加载。这种设计确保了类的唯一性,防止类的重复加载和安全问题。
解析Java虚拟机中类的初始化及加载器的父委托机制
这种机制确保了核心类库的优先级高于用户自定义类库,避免了类加载的冲突和安全问题。
解析Java虚拟机中类的初始化及加载器的父委托机制共14页
四、案例分析在实际开发中,自定义类加载器或者理解类加载过程可以帮助我们解决特定问题,比如实现类的热替换、隔离不同版本的类库等。然而,如果不熟悉父委托机制,可能会导致类加载混乱,产生如类定义冲突等问题。
Java的类加载器
类加载器的概念是Java动态加载和运行时类重定义的关键。下面将详细探讨类加载器的工作原理、层次结构以及自定义类加载器的应用。1.
【JVM】类加载器与双亲委派模型
这种机制确保了基础类库的唯一性,防止用户自定义的类覆盖Java的核心类,如上述示例中的`Object`类。如果没有双亲委派模型,可能会导致类的重复加载,甚至可能导致安全问题。


