der loader) throws Exception{
if(loader == null) return;
System.out.println("travase classloader:" + loader.toString());
while(loader.getParent() != null){
System.out.println(loader.getParent());
loader = loader.getParent();
}
}
public static void test(ClassLoader loader) throws Exception {
Class<?> clazz = loader.loadClass("com.ice.classloader.LoadedClass");
Object object = clazz.newInstance();
}
public static void testNameSpace(ClassLoader loader) throws Exception {
Class<?> clazz = loader.loadClass("com.ice.classloader.LoadedClass");
Object object = clazz.newInstance();
try{
LoadedClass lc = (LoadedClass) object;
}catch(Exception e){
e.printStackTrace();
}
}
}
被加载类LoadedClass的定义如下:
//被加载类
package com.ice.classloader;
public class LoadedClass {
public LoadedClass() {
System.out.println("LoadedClass is loaded by: "
+ this.getClass().getClassLoader());
}
}
(1).双亲委派结果
child加载器会委托father进行加载,若father的加载目录下存在着对应的class文件,则会由 父加载器father进行对应的加载工作(father也会交由AppClassLoader和ExtClassLoader尝试进行加载,但这两个加载 器并不知道如何加载,故而最后会自己尝试进行加载)
当father的加载目录下没有对应的class文件,则会交由child进行加载
(2).命名空间隔离
由于MyClassLoader是通过系统的(应用程序类加载器/类路径加载器加载的),而 LoadedClass是由user加载器所加载的,AppClassLoader加载器是user加载器的父加载器,故由父加载器加载的类 MyClassLoader无法看见子加载器user所加载的LoadedClass类,在MyClassLoader中尝试实例化 LoadedClass类时就会出现如下错误:
对应出错的正是尝试实例化LoadedClass类的那一行
try{
LoadedClass lc = (LoadedClass) object;
}catch(Exception e){
(3).运行时包
当请求加载一个com.ice.classloader.virus类时,AppClassLoader路径下没有 该类的class文件,那么attaker加载器将会加载这个virus类,并暗示其为com.ice.classloader的一部分,该类想要获取 com.ice.classloader包下被信任类的访问权限。但由于权限检查时,由于该Virus类由attacker加载而非 AppClassLoader加载,故对MyClassLoader受保护成员的访问将会被阻止。
package com.ice.classloader;
public class Virus {
public Virus() {
System.out.println("Virus is loaded by: "
+ this.getClass().getClassLoader());
MyClassLoader cl = (My