Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:URLClassLoader将加载的类保存在临时目录中_Java_Classloader_Temp_Urlclassloader - Fatal编程技术网

Java:URLClassLoader将加载的类保存在临时目录中

Java:URLClassLoader将加载的类保存在临时目录中,java,classloader,temp,urlclassloader,Java,Classloader,Temp,Urlclassloader,我正在尝试使用URLClassLoader从web加载jar文件,所有这些都可以正常工作,但所有加载的类都存储在Windows临时目录中,并且可以复制以进行解密,直到调用classLoader.close()这反过来会导致程序ClassNotFoundException 我可以在不保存到磁盘的情况下加载类吗 (只有内存)另一个解决方案加密jar类,并编写自定义类加载器来解密类,但我没有找到任何示例 我试图寻找有关此主题的文档或文章:( 请告诉我是否可以实现以及我可以在哪里获取有关该主题的资料?谢

我正在尝试使用
URLClassLoader
从web加载jar文件,所有这些都可以正常工作,但所有加载的类都存储在Windows临时目录中,并且可以复制以进行解密,直到调用
classLoader.close()这反过来会导致程序
ClassNotFoundException

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

(只有内存)另一个解决方案加密jar类,并编写自定义类加载器来解密类,但我没有找到任何示例

我试图寻找有关此主题的文档或文章:(


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

您确实意识到,任何能够访问您正在运行代码的机器的人都可以随时获得将执行自定义类加载的代码,对吗?这意味着他们可以简单地反编译该类本身并使它写出了解密后的类,使得整个练习毫无意义。没错,大多数人不知道怎么做,但这是可能的

我的建议是,如果你真的必须这样做的话,只需混淆代码就行了。担心有人掌握了你的库不会让你走多远,因为你几乎无法保护它不被反编译,除非你使用混淆的代码结构,这会混淆反编译器(或者特性
jad
等不支持,从而导致它们产生严重破坏的反编译代码)


任何具有足够知识和适当动机的人都会想出一种方法来实现这一点。

创建自己的类加载器,通过网络检索类是相当简单的。在Java文档示例中:


您只需实现
loadClassData
,其他一切都会为您处理。在
loadClassData
功能中,您可以进行加密或其他任何操作。

除了模糊处理之外,我不知道可靠的保护方法,但这种保护与代码模糊处理完全一样,只会减慢反编译过程我认为java是开放的,任何在它里面的库也必须如此。如果java中的二进制文件是加密的,反编译代码就不会那么容易了,C++的世界里,java开发者希望通过代码来保护代码。在Java开始成为主流的几年后出现的许可证。这些许可证中有很多与Java项目密切相关(尽管它们的措辞非常笼统).是的,你可以在内存中读取jar并从中加载类,但有人仍然可以反编译你的类,对其进行反向工程,重新编译并用他们的类加载程序替换你的自定义类加载程序。这真的是白费力气。有了适当的动机,知道他们在做什么的人会破解这个。如果代码是敏感的(代码也有敏感度,就像数据一样),然后你需要将其保存在你控制的服务器上。它不应该在[潜在]攻击者控制的桌面或设备上本地可用。
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
          . . .
     }
 }