创建一个自定义类加载器实现class文件(字节码文件)的加密解密的实例

来源:互联网 发布:淘宝店铺封面象数多少 编辑:程序博客网 时间:2024/05/17 02:47


一.自定义类加载器的思路:

1.加密解密(编码解码)方法,在自定义类中(MyClassLoader )创建cypher(InputStream ips ,OutputStream ops)函数,对函数的输入流ips处理后,传递给输出流ops,这样就实现了简单的加密解密。
2.自定义类中(MyClassLoader )继承ClassLoader类,重写findClass方法,这样就能实现自定义的类加载器。
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{/** * @param args */public static void main(String[] args) throws Exception {// TODO Auto-generated method stubString 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);//如果需要安全的算法,请自行替换本语句}}private String classDir;@Override/** * 1.findClass方法:使用指定的二进制名称查找类,重写findClass的目的:重写findClass方法能自定义类加载器的加载方式。 * 2.loadClass方法:该方法的的默认实现将按以下顺序搜索类: * (1).调用 findLoadedClass(String) 来检查是否已经加载类。 * *(2).在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。  * *(3).调用 findClass(String) 方法查找类。 * *如果直接重写loadCLass方法,需要自己重写查找父类的方法,要么没有查找父类直接使用自定义的。鼓励用 ClassLoader 的子类重写 findClass(String),而不是使用此方法。 * * */protected Class<?> findClass(String name) throws ClassNotFoundException {// TODO Auto-generated method stubString classFileName = classDir + "\\"  + name.substring(name.lastIndexOf('.')+1) + ".class";//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) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public MyClassLoader(){}//传入的实际参数为文件所在的绝对路径名public MyClassLoader(String classDir){  //classDir是class文件所在的绝对路径this.classDir = classDir;}}

二.使用上面自定义类加密Class文件的方法(在eclipse下运行):
复制需要加密的class文件的绝对路径名:比如路径名为“G:\WorkSpace\exam\src\ClassLoaderText.class”。
自定义一个class文件加密后要保存的位置,比如“G:\WorkSpace\exam\src\Text”(txt文件夹里);
在eclipse中打开自定义类(MyClassLoader ),右击“Run As”->“Run Configurations”,这样就打开了“Run Configurations”对话框。

1)对话框中的“Main”->“Main Class”中必须是自定义类。
2)对话框中的“Arguments”->“Program Arguments”中填入class文件路径和需要保存的位置:G:\WorkSpace\exam\src\ClassLoaderText.class G:\WorkSpace\exam\src\Text
3)点击“Run”,这样class文件就会加密并保存到“G:\WorkSpace\exam\src\Text”位置中。

需要加密的class文件的java代码实例:
import java.util.Date;public class ClassLoaderText extends Date {public String toString(){return "Hello class";}}

三.将加密后的class文件覆盖原文件,不调用自定义类加载器则无法使用加密后的class文件。使用加密的class文件的方法,实现代码如以下实例:
import java.util.Date;public class Test11 {public static void main(String[] args) throws ClassNotFoundException, Exception {Class clazz = new MyClassLoader("G:\\WorkSpace\\exam\\src\\Text").findClass("cClassLoaderText");//Class clazz = new MyClassLoader("G:\\WorkSpace\\exam\\src\\Text").loadClass("cClassLoaderText");//使用loadClass和findClass略有不同Date d1 =  (Date)clazz.newInstance();System.out.println(d1);}}

以前内容参考黑马程序员教程总结而来。

0 0
原创粉丝点击