当前位置:网站首页>自定义类加载器对类加密解密

自定义类加载器对类加密解密

2022-06-27 00:28:00 wfsm

如果需要编写自己的类加载器,只需要继承ClassLoader类,重写findClass(String className)方法

ClassLoader超类的loadClass()方法用于将类的加载操作委托给父类加载器去执行,如果这个父类加载器无法加载这个类,就会调用这个类加载器的findClass()
loadClass()是实现双亲委派模型逻辑的地方,擅自修改这个方法会导致模型被破坏,所以为了保证双亲委派模型不被破坏,建议不要重写loadClass(),而是在findClass()中重写自定义类的方法


public class User {
    
    private String name = "Rocky";
    private int age = 18;
    }

加密解密工具类:

public class XorEncryptUtil {
    
    private static void xor(InputStream in, OutputStream out) throws IOException {
    
        int ch;
        while ((ch = in.read()) != -1){
    
            ch  = ch^ 0xff;
            out.write(ch);
        }
    }


    public static void encrypt(File src, File des) throws IOException {
    
        FileInputStream in = new FileInputStream(src);
        FileOutputStream out = new FileOutputStream(des);
        xor(in,out);
        in.close();
        out.close();
    }


    public static byte[] decrypt(File src) throws IOException {
    
        FileInputStream in = new FileInputStream(src);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        xor(in,out);

        byte[] data = out.toByteArray();
        in.close();
        out.close();
        return data;
    }


    public static void main(String[] args) throws IOException {
    
        File src = new File("C:\\Users\\Administrator\\Desktop\\sb\\1.txt");
        File des = new File("C:\\Users\\Administrator\\Desktop\\sb\\2.txt");
        XorEncryptUtil.encrypt(src,des);

        byte[] decrypt = XorEncryptUtil.decrypt(des);
        String s = new String(decrypt);
        System.out.println("s = " + s);


    }
}

classLoader:

public class MyClassLoader extends ClassLoader {
    
    private String basePath;
    private final static  String FILE_EXT = ".class";

    public MyClassLoader(String basePath) {
    
        this.basePath = basePath;
    }

    public MyClassLoader() {
    
    }

    /** * 解密: 使用自己的ClassLoader * @param className * @return */
    private byte[] loadClassData(String className){
    
        try {
    
// String tempName = className.replaceAll("\\.", System.getProperty("file.separator"));
            String tempName = className.replaceAll("\\.", Matcher.quoteReplacement(File.separator));
            File targetFile = new File(basePath + tempName + FILE_EXT);
            return XorEncryptUtil.decrypt(targetFile);
        } catch (IOException e) {
    
            System.out.println("silly b");
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected Class<?> findClass(String className) throws ClassNotFoundException {
    
        byte[] data = this.loadClassData(className);
        return this.defineClass(className, data, 0, data.length);
    }


    public static void main(String[] args) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException {
    
        XorEncryptUtil.encrypt(new File("I:\\java\\springsecurity\\springsecuritylearn\\security\\target\\classes\\security\\User.class"),
                new File("C:\\Users\\Administrator\\Desktop\\sb\\User.class"));

        MyClassLoader myClassLoader = new MyClassLoader();
        myClassLoader.basePath = "C:\\Users\\Administrator\\Desktop\\sb\\";
        Class<?> clazz = myClassLoader.findClass("security.User");
        System.out.println(clazz.getClassLoader());
        Object o = clazz.newInstance();
        System.out.println("o = " + o);
    }
}

遇到的问题:

  • NoClassDefFoundError: User (wrong name: security/User)
    被编译的User有包名,解析的时候也需要包名

  • java.lang.IllegalArgumentException: character to be escaped is missing

在这里插入图片描述

引用:https://blog.csdn.net/rockvine/article/details/124836389
https://blog.csdn.net/weixin_34321977/article/details/91658732

原网站

版权声明
本文为[wfsm]所创,转载请带上原文链接,感谢
https://waterkid.blog.csdn.net/article/details/125457519