Java:URLClassLoader在Temp目录中保存已加载的类

时间:2014-03-24 13:51:44

标签: java classloader temp urlclassloader

我尝试使用URLClassLoader从网上加载jar文件,一切正常,但所有加载的类都保存在Windows临时目录中,并且可以复制以进行反混淆,直到我调用{{1}这反过来会导致程序classLoader.close();

我可以在不保存到磁盘的情况下加载类吗?

(仅内存)另一个解决方案是加密jar类,编写将解密类的自定义 ClassLoader ,但我找不到任何示例。

我试图查找有关此主题的文档或文章,but found nothing :(

请告诉我是否可以实施以及我可以在哪里获取有关该主题的材料?谢谢!

2 个答案:

答案 0 :(得分:2)

您确实知道有权访问您运行代码的计算机的任何人都可以随时获取将执行自定义类加载的代码,对吧?这意味着他们可以简单地反编译该类本身并使其写出解密的类,使整个练习毫无意义。没错,大多数人都不会知道怎么做,但这是可能的。

如果你真的必须这样做,我的建议就是混淆代码。担心人们抓住你的图书馆并不会让你走得太远,因为除非你使用混淆代码结构来混淆反编译器(或者特征{{1}),否则你几乎无法保护它免受反编译。并且喜欢不支持,从而导致他们产生严重破坏的反编译代码。)

任何有足够知识和适当动力的人都会找到一种方法。

答案 1 :(得分:1)

创建自己的ClassLoader从网络上检索类是相当简单的。在Classloader的Java文档示例中:

class NetworkClassLoader extends ClassLoader {
     String host;
     int port;

     public Class findClass(String name) {
         byte[] b = loadClassData(name);
         return defineClass(name, b, 0, b.length);
     }

     private byte[] loadClassData(String name) {
         // load the class data from the connection
          . . .
     }
 }

您只需要实施loadClassData,其他所有内容都会为您处理。在loadClassData函数中,您可以使用加密或其他任何内容。