创建一个自定义类加载器实现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文件的绝对路径名:比如路径名为“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
- 创建一个自定义类加载器实现class文件(字节码文件)的加密解密的实例
- 自定义类加载器实现对字节码文件的加密和解密
- Java虚拟机----自定义类加载器:实现对字节码的加密解密
- 简单的class文件加密解密
- 自定义类加载器(实现加密和解密)
- Class的字节码文件
- 自定义classload加载自定义的class文件
- 文件的加密解密
- .class文件(字节码)的结构
- C#对文件的字节加密/解密-可逆
- C#对文件的字节加密/解密-可逆
- 汇编语言简易加密解密文件的实现
- 字节码文件class文件的结构
- class文件的加载、初始化、实例化
- 黑马程序员-Java 类加载器和class文件的加解密
- 大文件加密(实现在文件流中进行加密解密的方法)
- 创建自己的类加载器,从不同的目录中加载class文件
- C++ 简单的文件加密和解密 实例
- poj3189Steady Cow Assignment
- 程序员努力提升自己,循序渐进学编程
- POJ3620
- c++ 线程并发、任务队列、异步 任务封装和分发 lambda与任务 boost
- android-Creating Multiple APKs for Different Screen Sizes,Creating Multiple APKs for Different GL Te
- 创建一个自定义类加载器实现class文件(字节码文件)的加密解密的实例
- 成为优秀程序员的10个有效方法-要有自己的认识
- BUAA:JY的题目【水】
- 2015年终总结
- hdu--5534
- linux基础指令(一)arch
- 补习班
- javascript实现端口扫描
- 指針