[黑马程序员] 高新_枚举、反射、泛型、类加载器、动态代理 (七)

2014-11-24 10:33:32 · 作者: · 浏览: 5
mport java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

/*
* 编写自定义类加载器, 可以对指定被加密的类解密加载.
*/

public class MyClassLoader extends ClassLoader {

private String classDir;

public MyClassLoader(){}
public MyClassLoader(String classDir){
this.classDir = classDir;
}

public static void main(String[] args) throws Exception{
String srcPath = args[0]; //定义源
String destDir = args[1]; //定义目标
FileInputStream fis = new FileInputStream(srcPath);
String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1);
String destPath = destDir + '\\' + destFileName;
FileOutputStream fos = new FileOutputStream(destPath);

cypher(fis, fos);
fis.close();
fos.close();
}

private static void cypher(InputStream ips, OutputStream ops) throws Exception {
int b = -1;
while((b=ips.read()) == -1){
ops.write(b ^ 0xff);
}
}

@Override
protected Class< > findClass(String name) throws ClassNotFoundException {
String classFileName = classDir + "\\" + name + ".class";
try {
FileInputStream fis = new FileInputStream(classFileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
cypher(fis, bos);
fis.close();
byte[] bytes = bos.toByteArray();
return defineClass(bytes, 0, bytes.length);
} catch (Exception e) {
e.printStackTrace();
}

return super.findClass(name);
}


}

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

/*
* 编写自定义类加载器, 可以对指定被加密的类解密加载.
*/

public class MyClassLoader extends ClassLoader {

private String classDir;

public MyClassLoader(){}
public MyClassLoader(String classDir){
this.classDir = classDir;
}

public static void main(String[] args) throws Exception{
String srcPath = args[0]; //定义源
String destDir = args[1]; //定义目标
FileInputStream fis = new FileInputStream(srcPath);
String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1);
String destPath = destDir + '\\' + destFileName;
FileOutputStream fos = new FileOutputStream(destPath);

cypher(fis, fos);
fis.close();
fos.close();
}

private static void cypher(InputStream ips, OutputStream ops) throws Exception {
int b = -1;
while((b=ips.read()) == -1){
ops.write(b ^ 0xff);
}
}

@Override
protected Class< > findClass(String name) throws ClassNotFoundException {
String classFileName = classDir + "\\" + name + ".class";
try {
FileInputStream fis = new FileInputStream(classFileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
cypher(fis, bos);
fis.close();
byte[] bytes = bos.toByteArray();
return defineClass(bytes, 0, bytes.length);
} catch (Exception e) {
e.printStackTrace();
}

return super.findClass(name);
}


}

24. 能不能自己写个类叫java.lang.System

答: 可以, 但是通常写了也没用, 因为类加载器的委托机制, 会一步一步往上找, 最终找到BootStrap, 然后BootStrap会在JRE/lib/rt.jar中找到原有的java.lang.System类.

* 除非自己写个类加载器, 直接调用ClassLoader.loadClass("java.lang.Sy