日志文章

2020-1-3 aflfte2011

简单的加密和解密类文件加载器

测试文件
package com.aflfte.test;
/**
 * 简单的加密解密(取反)操作
 *
 * @author root
 *
 */
public class Demo04 {
    public static void main(String[] args) throws Exception {
        //取反测试
        /*int a=3;
        System.out.println(Integer.toBinaryString(a^0xff));*/
        DecrptClassLoader l=new DecrptClassLoader("/root/myjava");
        Class<?> c=l.loadClass("com.aflfte.test.HelloWorld");
        System.out.println(c);
    }
}




加密类文件
package com.aflfte.test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 加密工具类
 * @author root
 *
 */
public class EncrptUtil {
    public static void main(String[] args) {
        encrpt("/root/myjava/com/aflfte/test/HelloWorld.class","/root/myjava/com/aflfte/test/hw.class");
    }
    public static void encrpt(String src,String dest) {
        FileInputStream fis=null;
        FileOutputStream fos=null;
        try {
            fis=new FileInputStream(src);
            fos=new FileOutputStream(dest);
            int temp=-1;
            while((temp=fis.read())!=-1) {
                fos.write(temp^0xff);//取反操作  相当于加密
            }
            fos.flush();
        } catch (Exception e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }finally {
            
            try {
                if(fis!=null) {
                    fis.close();
                }
                if(fos!=null) {
                    fos.close();
                }
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            
        }
    }
}


解密类加载器代码:


package com.aflfte.test;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 加载文件系统加密后的类加载器
 * @author root
 *
 */
//第一步继承ClassLoader
public class DecrptClassLoader extends ClassLoader {
    //转化过程:com.aflfte.test.User-->/root/mywork/类加载全过程/src/com/aflfte/test/User.class
    private String rootDir;

    public DecrptClassLoader(String rootDir) {
        super();
        this.rootDir = rootDir;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        Class<?> c=findLoadedClass(name);
        if(c!=null) {//先检查有没有加载这个类,如果已经加载,则直接返回加载好的类.如果没有则加载新的类
            
            return c;
        }else {//如果没有加载则要他的父类先加载
            ClassLoader parent=this.getParent();
            try {
            c=parent.loadClass(name);//委派给父类加载器进行加载
            }catch (Exception e) {
                //e.printStackTrace();
            }
            if(c!=null) {
                return c;
            }else {
                byte[] classData=getClassData(name);
                if(classData==null) {
                    throw new ClassNotFoundException();//如果没有加载成功则抛出异常
                }else {
                    c=defineClass(name, classData, 0, classData.length);
                }
            }
        }
        return c;
    }
    private byte[] getClassData(String classname) {
        String path=rootDir+"/"+classname.replace(".", "/")+".class";
        //IOUtils可以使用它装数据流中的数据转成数组
        InputStream is=null;
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        try {
            is=new FileInputStream(path);
            int temp=0;
            while((temp=is.read())!=-1) {
                baos.write(temp^0xff);//取反操作 相当于解密
            }
            baos.flush();
            return baos.toByteArray();
        } catch (Exception e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
            return null;
        }finally {
            try {
                if(is!=null) {
                    is.close();
                }
                if(baos!=null) {
                    baos.close();
                }
                    
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
        
        //return null;
    }
    
}


« 饿汉式单例模式 | 自定义类加载器»