0

我想*.class从实现接口的文件系统加载文件。

但我只想加载依赖于java.util.*包中的类的类文件?这可能吗?如果可以,怎么办?我的意思是如果是动态创建的,它可以检测到非法类的使用吗?使用本机图像时这也可能吗?

提前致谢。

4

1 回答 1

0

但我只想加载依赖于 java.util.* 包中的类的类文件?这可能吗?如果可以,怎么办?

我认同。

类的加载器由thatClassInstance.getClassLoader(). .defineClass()它是调用其方法来加载类的加载器。

想法是,只要该类执行涉及任何其他类的任何操作,就会要求其类加载器提供所述类。

现在,通常,该类加载器将询问其父加载器是否已经加载了此类,或者是否可以加载该类,并且只会返回该类(然后该类的加载器将用于该类最终使用的任何内容)。然而,那只是因为loadClassClassLoader 的方法是这样编程的。您可以改为覆盖它。

所以,计划是:

编写一个类加载器。这将加载您要“限制地”加载的自定义类,因此,请确保您是调用defineClass. 不要覆盖 findClass(因为只有在父加载器没有加载该类并且找不到它时才会调用它),覆盖 loadClass。

然后,您的 loadClass 也将被加载的类试图检查的任何内容调用。因此,检查正在加载的类的名称。如果是您不喜欢的名称,请拒绝加载。如果这是您喜欢的名称,请让父母加载它。

请注意,有人可以创建一个名为 的文件Foo.java,将:package java.util; public class Foo {}放入其中,然后让您的加载程序加载java.util.Foo. 这不是一个试图阻止人们做讨厌事情的好机制,基本上没有安全的方法可以在你自己的虚拟机上运行你不信任的代码。如果这就是你想要这样做的原因,没关系——你就是不能那样做。

于 2020-12-13T17:17:55.967 回答