1

我正在寻找实例化和映射给定类型的类路径中的所有类。

我已经使用Reflections库完成了扫描,并获得了已加载的类列表。

然后,当我映射它们时,我正在检查冲突(关键是简单的类名)。

当这种情况发生时,我想抛出一个异常,指出冲突类的完全限定名称,以及它们被加载的路径(例如,JARs可以找到每个类的路径)。

我意识到也可以从内存中加载一个类,但是假设我是从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

4

1 回答 1

1

建议你换

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 可用的资源 - 根据API

这个方法委托给这个对象的类加载器。如果此对象由引导类加载器加载,则该方法委托给 ClassLoader.getSystemResource(java.lang.String)。

我怀疑如果你看一下你的例子getClass().getClassLoader()class1.getClassLoader()你可能会发现它们是不同的。

于 2015-01-21T14:25:51.033 回答