的安全机制,同一命名空间内的类可 以互相访问,所以父加载器所加载的类不一定可以访问子加载器所加载的类,但子加载器所加载的类必然可以访问父加载器加载的类。父加载器加载的类就好像小箱 子,子加载器加载的类可能用到父加载器加载的类,就像一个大箱子,只能把小箱子放进大箱子,而不能反过来做(当然显式的访问机制除外)
以自己实现的类加载器为例:
package com.ice.classloader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class MyClassLoader extends ClassLoader {
private String name; //加载器名称
private String path = "E:\\WorkSpace\\ClassLoaderTest\\"; //加载路径
private static final String HOME = "E:\\WorkSpace\\ClassLoaderTest\\";
private final String classFileType = ".class";
public MyClassLoader(String name) {
super();
this.name = name;
}
public MyClassLoader(ClassLoader parent, String name) {
super(parent);
this.name = name;
}
@Override
public String toString() {
return this.name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
@Override
public Class<?> findClass(String name) throws ClassNotFoundException {
byte[] data = this.loadClassData(name);
if(data == null)
throw new ClassNotFoundException();
return this.defineClass(name, data, 0, data.length);
}
private byte[] loadClassData(String name) {
InputStream is = null;
byte[] data = null;
ByteArrayOutputStream baos = null;
// System.out.println(" classloader:" + this.name + " try to load");
try {
//类名转化为路径
name = name.replace(".", "\\");
is = new FileInputStream(new File(path + name + classFileType));
baos = new ByteArrayOutputStream();
int ch = 0;
&n |