按照Classloader的说法:不同的Classloader加载的类是不能相互访问的。先看一个例子:
public class Test{
public static void main(){
MyClassLoader cl = new MyClassLoader();
Class c = classloader.loadClass("A");
Object o = c.newInstance();
Method m = c.getMethod("run");
m.invoke(o);}
}
public class People{
public void run(){
System.out.println(Main.class.getClassLoader());
}
}public class MyClassLoader extends ClassLoader{
................................
public Class loadClass(String name) throws ClassNotFoundException{
System.out.println("try to load class " + name);
if("People".equals(name)){
return getSystemClassLoader().loadClass(name);
}
return loadClass(name, false);
}
public Class loadClass(String name, boolean resolve)throws ClassNotFoundException{
String filepathName = name.replace('.', '/');
//find class from current directory
byte[] b = read(new File(filepathName + ".class"));
Class clazz = defineClass(name, b, 0, b.length);
if(resolve){
resolveClass(clazz);
}
if(clazz == null){
throw new ClassNotFoundException("conld not find class " + clazz);
}
return clazz;
}}
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
foo.SomeClass a = new foo.SomeClass()
子加载器在加载类之前会先委托父加载器先进行加载。这也就是类加载器父委托机制。但是父加载器不能委托子加载器进行加载,所以people是可以访问到父加载器加载的类。而父加载器加载的类。不能访问到子加载器加载的类。
子加载器可以访问父加载器加载的类。
兄弟加载器加载的类不能访问
这个符合面向对象的特性
向下具备可见性!