java - 获取JAVA中动态加载的类的.class文件的路径

标签 java reflection classpath dynamic-class-loaders reflections

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

我已经使用 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/

相关文章:

java - 更改JSP文件名时还需要更改什么

java - 当文档以小写 &lt;!doctype 开头时, Karate HTML 解析抛出 SaxException

c# - 如何引用类(不是对象)的属性?

android - R8 去除反射所需的 Kotlin 伴生对象

java - Spring 3.0 webapp NoClassDefFoundError - 类路径问题

java - 按属性对 Java ArrayList<MyObject> 进行排序

java - 在哪里可以找到为 GroupLayout 构建组的工具?

通过注解注入(inject) Java 字段

java - 如何从类路径加载/引用文件作为 File 实例

java.lang.ClassNotFoundException : JDBC driver in Ubuntu