限制类加载类中的类使用

whhtz7ly  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(272)

我要装货 *.class 文件系统中实现接口的文件。
但是我只想加载依赖于 java.util.* 包裹?这可能吗?如果可能,怎么可能?我的意思是,如果是动态创建的,是否有可能检测到非法类的使用?使用本机映像时也可以这样做吗?
提前谢谢。

2g32fytz

2g32fytz1#

但是我只想加载依赖于java.util.*包中的类的类文件?这可能吗?如果可能,怎么可能?
我认为是这样。
类的装入器由 thatClassInstance.getClassLoader() . 是装载机 .defineClass() 方法来加载类。
我们的想法是,每当该类执行任何涉及其他类的操作时,它的类装入器都会被要求提供所述类。
现在,通常情况下,类加载器会询问它的父加载器是否已经加载了这个类,或者它是否可以加载那个类,并且只返回那个类(然后那个类的加载器被用来处理这个类最终使用的任何东西)。然而,那只是因为 loadClass 类加载器的方法就是这样编程的。你可以替代它。
所以,计划是:
编写一个类加载器。这个类将加载您想要“限制性”加载的自定义类,因此,确保您是调用它的人 defineClass . 不要重写findclass(因为只有在父加载程序没有加载该类并且找不到该类时才会调用它),重写loadclass。
然后,对于加载的类试图检查的任何内容,也将调用您的loadclass。因此,检查要加载的类的名称。如果它是一个你不喜欢的名字,拒绝加载它。如果您确实喜欢这个名字,请让家长加载它。
请注意,有人可以创建一个名为 Foo.java ,输入: package java.util; public class Foo {} 里面,然后让你的装载机装载 java.util.Foo . 这不是一个好的机制来阻止人们做讨厌的事情,基本上没有安全的方法来运行你自己的虚拟机上不信任的代码,句号。如果这就是你想做这件事的原因,没关系-你就是做不到。

相关问题