我正在寻找实例化和映射给定类型的类路径中的所有类。
我已经使用 Reflections
库完成了扫描,并获得了已加载的类的列表。
然后,当我映射它们时,我会检查冲突(关键是简单的类名)。
当发生这种情况时,我想抛出一个异常,指出冲突类的完全限定名称,以及它们加载的路径(例如,可以在其中找到每个 JAR)。
我意识到人们也可以从内存加载一个类,但假设我是从磁盘上的 JAR
加载它,我想知道是否有任何方法可以获取该路径...
请参阅下面的代码片段:
if (isConflictingFactoryRegistered(key, myFactory)) {
Class<? extends MyFactory> class1 = factoryMap.get(key).getClass();
Class<? extends MyFactory> class2 = myFactory.getClass();
try {
throw new RuntimeException("Found two conflicting factories for " + key
+ ": 1. " + class1 + " in " + getClass().getResource(class1.getSimpleName()+".class").toURI() +
" 2. " + class2 + " in " + getClass().getResource(class2.getSimpleName()+".class").toURI());
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
} else {
factoryMap.put(myFactory.getName(), myFactory);
}
这段代码确实可以编译 - 但它不会工作; getClass().getResource(class1.getSimpleName()+".class") 返回 null。如何获取 .class
的路径?
最佳答案
建议你更换
throw new RuntimeException("Found two conflicting factories for " + key
+ ": 1. " + class1 + " in " + getClass().getResource(class1.getSimpleName()+".class").toURI() +
" 2. " + class2 + " in " + getClass().getResource(class2.getSimpleName()+".class").toURI());
与
throw new RuntimeException("Found two conflicting factories for " + key
+ ": 1. " + class1 + " in " + class1.getResource(class1.getSimpleName()+".class").toURI() +
" 2. " + class2 + " in " + class2.getResource(class2.getSimpleName()+".class").toURI());
这适用于我的机器上的两个任意类。
一般来说,我认为 Class.getResource()
只能找到可用于加载该特定类的同一个 ClassLoader 的资源 - 根据 the API ,
This method delegates to this object's class loader. If this object was loaded by the bootstrap class loader, the method delegates to ClassLoader.getSystemResource(java.lang.String).
我怀疑如果您查看示例中的 getClass().getClassLoader()
和 class1.getClassLoader()
,您可能会发现它们是不同的。
关于java - 获取JAVA中动态加载的类的.class文件的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28067305/