我想从实现接口的文件系统加载*.class
文件。
但是我只想加载依赖于java.util.*
包中的类的类文件?这可能吗?如果可能,怎么做?我的意思是,如果是动态创建的,是否可以检测到非法类的使用?在使用本机图像时也可以这样做吗?
提前谢谢。
但是我只想加载依赖于java.util.*包中的类的类文件?这可能吗?如果可能,怎么做?
我想是的。
类的加载器由thatClassInstance.getClassLoader()
返回。它是调用其.defineClass()
方法来加载类的加载器。
其思想是,每当该类做任何涉及任何其他类的事情时,它的类加载器都会被要求提供所述类。
现在,通常情况下,该类加载程序会询问其父加载程序是否已经加载了该类,或者是否可以加载该类,然后只返回该类(然后该类的加载程序将用于该类最终使用的任何内容(。然而,这只是因为ClassLoader的loadClass
方法是这样编程的。您可以替代它。
因此,计划是:
编写一个类加载器。这将加载您想要"限制性"加载的自定义类本身,因此,确保您是调用defineClass
的那个。不要重写findClass(因为只有当父加载程序没有加载该类并且找不到它时才会调用findClass(,重写loadClass。
然后,您的loadClass也将被调用,用于加载的类试图检查的任何内容。因此,请检查正在加载的类的名称。如果它是一个你不喜欢的名字,拒绝加载它。如果它是你喜欢的名称,请家长加载它。
请注意,有人可以制作一个名为Foo.java
的文件,将:package java.util; public class Foo {}
放入其中,然后要求加载程序加载java.util.Foo
。这不是一个阻止人们做坏事的好机制,基本上没有安全的方法在自己的VM上运行你不信任的代码。如果这就是你想这么做的原因,别介意——你就是做不到。