ClassLoader) this.getClass().getClassLoader();
System.out.println("secret is:" + cl.secret);
}
}
MyClassLoader 由AppClassLoader所加载,而Virus由用户自定义的加载器attacker所加载,虽然AppClassLoader是attacker 的父加载器,即MyClassLoader对Virus可见,但由于两者不是由同一个加载器所加载,即不属于同一个运行时包,那么Virus对 MyClassLoader的受保护成员访问受限
public class MyClassLoader extends ClassLoader {
protected int secret = -1;
//...
public static void main(String[] args) throws Exception {
//其父加载器为Bootstrap ClassLoader
MyClassLoader loader = new MyClassLoader(null, "loader");
loader.setPath(HOME + "usr\\");
MyClassLoader attacker = new MyClassLoader("attacker");
attacker.setPath(HOME + "attacker\\");
System.out.println("MyClassLoader's classloader:" + MyClassLoader.class.getClassLoader());
System.out.println("-------------test parent--------------");
//测试父加载器关系
traverseParent(attacker);
System.out.println("-------------test in-package access--------------");
testVirus(attacker);
}
public static void traverseParent(ClassLoader 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 testVirus(ClassLoader loader) throws Exception {
Class<?> clazz = loader.loadClass("com.ice.classloader.Virus");
Object object = clazz.newInstan