本帖最后由 思维 于 2014-8-12 23:02 编辑
这两天学了下类加载器,使用EditPlus写了自定义类加载器进行加密与解密的代码,出现了各种问题,郁闷的不行,谁来解决下啊?问题一:运行MyClassLoader类后将加密的ClassLoaderAttachment覆盖原来的.class文件,解密时产生ClassFormortError (注意:所有的类均在D:\JavaDemo\下)
- import java.io.*;
- import java.util.*;
- class MyClassLoader extends ClassLoader{
- //编译:java MyClassLoader D:\JavaDemo\ClassLoaderAttachment.class D:\
- 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 = name.substring(name.lastIndexOf('.')+1)+".class";
- try{
- //创建加密文件的文件输入流对象
- FileInputStream fis = new FileInputStream(classFileName);
- //创建解密文件的字节数组输出流对象
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- //对加密数据进行解密
- cypher(fis,bos);
- fis.close();
- byte[] bytes = bos.toByteArray();
- return defineClass(null,bytes,0,bytes.length);
- }catch(Exception e){
- e.printStackTrace();
- }
- return null;
- }
- }
- //创建一个需要被加密的类
- class ClassLoaderAttachment extends Date{
- public String toString(){
- return "你好,黑马训练营!";
- }
- }
复制代码 测试代码:- import java.util.*;
- //对类的加密结果进行测试
- public class ClassLoaderTest{
- public static void main(String[] args)throws Exception{
- //System.out.println(new ClassLoaderAttachment().toString());
- Class clazz =
- new MyClassLoader().loadClass("ClassLoaderAttachment");
- Date cla1 = (Date)clazz.newInstance();
- System.out.println(cla1);
- //ClassLoaderAttachment cla1 = clazz.newInstance();
- //ClassLoaderAttchment已经被加密,无法被编译器识别,因此需要继承Date类
- }
- }
复制代码 问题二:运行MyClassLoader类后将加密的ClassLoaderAttachment存入My目录下,同时删除D:\JavaDemo下的ClassLoaderAttachment,解密时产生IllegalAccessException
- import java.io.*;
- import java.util.*;
- class MyClassLoader extends ClassLoader{
- //编译:java MyClassLoader D:\JavaDemo\ClassLoaderAttachment.class D:\
- 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);
- }
- }
- private String classDir;
- public MyClassLoader(){
-
- }
- public MyClassLoader(String classDir){
- this.classDir = classDir;
- }
- //自定义类加载器
- @Override
- protected Class<?> findClass(String name)throws ClassNotFoundException{
- //获得加密文件和路径
- String classFileName =
- classDir + "\\" + name.substring(name.lastIndexOf('.')+1) + ".class";
- try{
- //创建加密文件的文件输入流对象
- FileInputStream fis = new FileInputStream(classFileName);
- //创建解密文件的字节数组输出流对象
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- //对加密数据进行解密
- cypher(fis,bos);
- fis.close();
- byte[] bytes = bos.toByteArray();
- return defineClass(null,bytes,0,bytes.length);
- }catch(Exception e){
- e.printStackTrace();
- }
- return null;
- }
- }
- //创建一个需要被加密的类
- class ClassLoaderAttachment extends Date{
- public String toString(){
- return "你好,黑马训练营!";
- }
- }
复制代码 测试代码
import java.util.*;
//对类的加密结果进行测试
public class ClassLoaderTest{
public static void main(String[] args)throws Exception{
//System.out.println(new ClassLoaderAttachment().toString());
Class clazz =
new MyClassLoader("D:\\JavaDemo\\My").loadClass("ClassLoaderAttachment");
Date cla1 = (Date)clazz.newInstance();
System.out.println(cla1);
//ClassLoaderAttachment cla1 = clazz.newInstance();
//ClassLoaderAttchment已经被加密,无法被编译器识别,因此需要继承Date类
}
}
|
|