该文章所涉及的代码,可以在此处下载:https://github.com/chengqianbygithub/JavaLearningDemos/tree/develop
在develop分支哦。
要实现classLoader动态解密class文件,就必须先了解Java的类加载机制、了解双亲委托机制。然后自定义一个classLoader,继承于classLoader。
关于Java虚拟机的类加载机制以及双亲委托机制,详细介绍:Java虚拟机类加载机制中的ClassLoader类加载器详解以及如何自定义ClassLoader类加载器
文章中引用到上一篇文章中的解密方法(edCipher.decryptClass(name)),详情请移步至:Java加密解密class文件
代码实现,很简单,具体解释都在代码注释中了。
/**
* 自定义ClassLoader,动态解密类
*/
public class EdClassLoader extends ClassLoader{
// 待动态加载解密的Class的全限定名(包名加类名)
private String fullyName;
public EdClassLoader(){
}
public EdClassLoader(String name){
this.fullyName = name;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
EdCipher edCipher = new EdCipher();
byte[] data = edCipher.decryptClass(name);
int length = data == null ? 0 : data.length;
return defineClass(fullyName, data, 0, length);
}
//在动态加载class文件后,需要通过反射才能调用其中方法
public static void main(String[] args) throws ClassNotFoundException {
EdClassLoader edClassLoader = new EdClassLoader("com.learn.classLoaderRelated.Test");
Object result = null;
try {
Class myClass = edClassLoader.findClass("F:\\Test.classen");
// method1 就是方法名
Method method = myClass.getDeclaredMethod("say");
Object obj = myClass.newInstance();
// result 就是方法返回值
result = method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
技 术 无 他, 唯 有 熟 尔。
知 其 然, 也 知 其 所 以 然。
踏 实 一 些, 不 要 着 急, 你 想 要 的 岁 月 都 会 给 你。