1.java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类:
BootStrap(jre/lib/rt.jar)、ExtClassLoader(jre/lib/ext/*.jar)、AppClassLoader(classPath指定的所有jar或目录)
2.类加载器也是java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这个加载器是:BootStrap(用c++写的)
3.java虚拟机中的搜有类加载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载器。
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class MyLoader extends ClassLoader {
public static void main(String args[]) throws IOException {
ClassLoader loader = MyLoader.class.getClassLoader();
while (loader != null) {
System.out.println(loader);
loader = loader.getParent();
}
String[] ss ={new String("E:\\javaweb\\enhanceHigh\\bin\\Test.class"),new String("class")};
setClass(ss);
}
private static void setClass(String[] args) throws FileNotFoundException,
IOException {
String srcPath = args[0];
String destDir = args[1];
FileInputStream in = new FileInputStream(srcPath);
String destPath = destDir + "\\"
+ srcPath.substring(srcPath.lastIndexOf('\\') + 1);
FileOutputStream out = new FileOutputStream(destPath);
cypher(in, out);
in.close();
out.close();
}
@SuppressWarnings("deprecation")
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// TODO Auto-generated method stub
String classFileName=classDir+"\\"+name+".class";
try {
FileInputStream fis=new FileInputStream(classFileName);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
cypher(fis, bos);
byte[] by=bos.toByteArray();
return defineClass(by, 0, by.length);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return super.findClass(name);
}
/**
* 数据加密类
* @param in
* @param out
* @throws IOException
*/
public static void cypher(InputStream in, OutputStream out)
throws IOException {
int b = -1;
while ((b = in.read()) != -1) {
out.write(b ^ 0xff);
}
}
private String classDir;
public MyLoader(String classDir){
this.classDir=classDir;
}
}
运行此类可以进行自己编写类的加密,并将加密以后的类放到一个目录下面。此类如果相运行,必须要用自定义的类加载器,即上面的类加载器。