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

卢卡斯

我对反射有问题我试图动态加载实现特定接口的所有类。只要我不在这些类中使用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表达式加载类?

PS对不起,英语:)

霍尔格

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

因此,您使用的库包含一个与Java 8不兼容的类解析器。实际上,该类解析器甚至与Java 7不兼容,因为自Java 7开始就指定了此常量值。它与普通Java代码在Java 7中不使用此功能无关,但是与不同语言生成的代码进行交互时却是如此。 JVM的编程语言,Java 7甚至可能会失败。

反射的错误跟踪器中一个项目描述您的问题。在底部,您会发现以下通知:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章