反射 - Java 8 - 无效的常量类型

2022-09-01 07:25:14

我对反射库有问题。我正在尝试动态加载所有实现特定接口的类。一切都很好(所有类都被加载),只要我不在这些类中使用lambda表达式(java 8)。我尝试升级lib版本,但效果是相同的(java.io.IOException:无效常量类型:18)。

依赖和构建pom.xml

      <dependency>
        <groupId>org.reflections</groupId>
        <artifactId>reflections</artifactId>
        <version>0.9.10</version>
        <exclusions>
            <exclusion>
                <groupId>javassist</groupId>
                <artifactId>javassist</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.19.0-GA</version>
    </dependency>
    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
    </build>

没有排除是相同的效果。

法典:

    URL jarUrl = jarFile.toURI().toURL();
    URLClassLoader child = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader());
    ConfigurationBuilder builder = new ConfigurationBuilder()
            .addClassLoader(child)
            .addUrls(jarUrl)
            .setScanners(new SubTypesScanner());
    Reflections r = new Reflections(builder);
    return r.getSubTypesOf(cls);

如何使用 lambda 表达式加载类?

附言 抱歉英文:)


答案 1

如果您查看此表,您将看到“常量类型:18”是指标记值为 的 CONSTANT_InvokeDynamic 属性。18

所以你使用的是一个库,它有一个与Java 8不兼容的类解析器。实际上,这个类解析器甚至与Java 7不兼容,因为这个常量值是从Java 7开始指定的。它只是逃脱了这一点,因为普通的Java代码在Java 7中不使用此功能。但是,当与JVM的不同编程语言生成的代码进行交互时,它甚至可能在Java 7中失败。

Reflections的错误跟踪器中有一个项目描述了您的问题。在底部,您将找到通知:

通过此修复:https://issues.jboss.org/browse/JASSIST-174 javassist获得了对此常量的支持。因此,在 3.18.2-GA 中,不会发生此错误。


答案 2

我解决了这个问题;

第一个升级 jar 到 ->javassist3.18.2-GA

  <dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.18.2-GA</version>
  </dependency>

其次添加 weblogic.xml

 <wls:package-name>javassist.*</wls:package-name>

推荐