运行时的类由其完全限定名称和ClassLoader标识。
例如,当您测试两个
Class<T>对象是否相等时,如果它们具有相同的规范名称,但是从不同的ClassLoader加载的,则它们将不相等。
对于两个属于同一个包的类(进而能够访问包私有方法),它们也需要从同一个ClassLoader加载,在这里不是这种情况。实际上
Test1是由系统类加载器加载的,而公式是由inside中创建的URLClassLoader加载的
loadClass()。
如果您为URLClassLoader指定一个父加载器以使其加载
Test1,则仍然使用两个不同的加载器(您可以通过声明加载器是否相等来对其进行检查)。
我认为您无法使
Formula该类由同一个
Test1ClassLoader加载(您必须使用众所周知的路径并将其放在CLASSPATH上),但是我发现了一种相反的方法:加载
Test1in的另一个实例用于加载公式的ClassLoader。这是伪代码中的布局:
class Test1 { public static void main(String... args) { loadClass(formula); } static void loadClass(location) { ClassLoader loader = new ClassLoader(); Class formula = loader.load(location); Class test1 = loader.load(Test1); // ... Method compute = test1.getMethod("compute"); compute.invoke(test1, formula); } static void compute(formula) { print formula; }}这是pastebin。一些注意事项:
null为避免上面列出的问题,我为URLClassLoader
指定了一个父级,并且我操纵了字符串以实现此目的-
但不知道这种方法在其他部署方案中的稳定性如何。另外,我使用的URLCLassLoader仅在两个目录中搜索以找到类定义,而不是在CLASSPATH中列出的所有条目



