import java.io.*; //主类必须继承ClassLoader,才可以直接使用difineClass public class MyClassLoader1 extends ClassLoader{ public static void main(String[] args) throws ArrayIndexOutOfBoundsException{ String src = args[0]; String dest = args[1]; // string的 substring方法返回一个新字符串,它是此字符串的一个子字符串。 // lastIndexOf方法返回指定子字符串在此字符串中最右边出现处的索引 String classFileName = src.substring(src.lastIndexOf('\\') + 1); try { InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest + "\\" + classFileName); encrypt(in, out); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 加密方法 private static void encrypt(InputStream in, OutputStream out) { int b = -1; try { while ((b = in.read()) != -1) { out.write(b ^ 0xff); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 私有化一个ClassDir变量 private String classDir = null; public MyClassLoader1() { } // 不能与类同名,但是有返回值,不是构造函数,那个,, public MyClassLoader1(String classDir) { this.classDir = classDir; } /* * classLoader的方法,findclass(String name) 使用指定的二进制名称查找类。返回值:Class<?> */ protected Class<?> findClass(String classname) { // 静态字段separator,返回值是string类型,与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 String classPath = classDir + File.separator + classname + ".class"; try { FileInputStream fin = new FileInputStream(new File(classPath)); // ByteArrayOutputStream byte数组输出流 ByteArrayOutputStream bout = new ByteArrayOutputStream(); encrypt(fin, bout); // 创建一个byte数组,用byte输出流的方法转换直接转换成byte[] byte[] bytes = bout.toByteArray(); // 关闭输入流 fin.close(); // defineClass将bytes数组,转换成Class类的实例。 return defineClass(null, bytes, 0, bytes.length); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } } |