Java实现自定义classLoader动态解密class文件

Posted 鲸落

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现自定义classLoader动态解密class文件相关的知识,希望对你有一定的参考价值。


前言

要实现classLoader动态解密class文件,就必须先了解Java的类加载机制、了解双亲委托机制。然后自定义一个classLoader,继承于classLoader。

文章中引用到上一篇文章中的解密方法(edCipher.decryptClass(name)),详情请移步至:Java加解密Class文件

代码实现

 1 /**
 2  * 动态加载类
 3  */
 4 public class EdClassLoader extends ClassLoader {
 5 
 6     private String toolFile = "com.pub.Secretive";
 7 
 8     private EdCipher edCipher = new EdCipher();
 9 
10     public EdClassLoader() {
11         super(Thread.currentThread().getContextClassLoader());
12     }
13 
14     @Override
15     protected Class<?> findClass(String name) throws ClassNotFoundException {
16         EdCipher edCipher = this.edCipher == null ? new EdCipher() : this.edCipher;
17         byte[] data = edCipher.decryptClass(name);
18         int length = data == null ? 0 : data.length;
19         return defineClass(toolFile, data, 0, length);
20     }
21 
22     @Override
23     public Class<?> loadClass(String s) throws ClassNotFoundException {
24         if (!s.contains("Checker")) {
25             Class loadedClass = findLoadedClass(s);
26             if (loadedClass == null) {
27                 loadedClass = getParent().loadClass(s);
28                 return loadedClass;
29             } else {
30                 return loadedClass;
31             }
32         }
33         return findClass(s);
34     }
35 
36     /**
37     * 获取需要解密的类
38     */
39     public String getToolfile() {
40         return toolFile;
41     }
42 
43     //在动态加载class文件后,需要通过反射才能调用其中方法
44     public static void main(String[] args) throws ClassNotFoundException {
45          EdClassLoader edClassLoader = new EdClassLoader();
46         Object result = null;
47         try {
48             Class myClass = edClassLoader.loadClass(edClassLoader.getToolfile());
49             // method1 就是方法名
50             Method method = myClass.getDeclaredMethod("method1");
51             Object obj = myClass.newInstance();
52             // result 就是方法返回值
53             result = method.invoke(obj);
54         } catch (Exception e) {
55             e.printStackTrace();
56         }
57         System.out.println(result);
58     }
59 }

 

以上是关于Java实现自定义classLoader动态解密class文件的主要内容,如果未能解决你的问题,请参考以下文章

java 自定义类的加载器

ClassLoader工作机制

java自定义classloader在加载jar包和classes的时候,classloader不能找到classpath下的配置文件

自定义classLoader

自定义注解实现解密+单个属性解密

ClassLoader实现自定义类加载器加载指定路径下的Class文件和Jar包