思考 - Java 8 - 无效的常量类型

Luk*_*asz 22 java javassist java-8 reflections

我有一个Reflections库的问题.我试图动态加载实现特定接口的所有类.只要我不在这些类中使用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>
Run Code Online (Sandbox Code Playgroud)

不排斥是同样的效果.

码:

    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);
Run Code Online (Sandbox Code Playgroud)

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

PS抱歉英语:)

Hol*_*ger 37

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

所以你使用的库有一个不兼容Java 8的类解析器.实际上,这个类解析器甚至不兼容Java 7,因为从Java 7开始就指定了这个常量值.它只是因为普通的Java代码在Java 7中没有使用这个特性.但是当与不同的代码交互时JVM的编程语言甚至可能因Java 7而失败.

在描述你的问题的Reflections的bug追踪器中一个项目.在底部,您会看到通知:

有了这个修复:https: //issues.jboss.org/browse/JASSIST-174 javassist得到了对这个常量的支持.因此,对于3.18.2-GA,不会发生此错误.

  • 我看到了这个解决方案,但我使用了这些库的最新版本.最后,我删除了反射库,并使用Guava lib为子类的类写了自己的反射.谢谢你的答复. (2认同)
  • 同样的问题:我在3个框架中有不同版本的javassist(HikariCP,Orika和Swagger-jaxrs),Maven选择了最老的一个作为自动分辨率(3.16-1.-GA而不是最新的3.19.0-GA) (2认同)

小智 9

我解决了这个问题;

首先将javassistjar 升级到 - >3.18.2-GA

  <dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.18.2-GA</version>
  </dependency>
Run Code Online (Sandbox Code Playgroud)

其次添加weblogic.xml

 <wls:package-name>javassist.*</wls:package-name>
Run Code Online (Sandbox Code Playgroud)


Bru*_*JCM 7

我刚刚解决了类似的问题.就我而言,我的类路径上有两个javassist jar.我使用maven并且应该避免这种情况,但是其中一个依赖项使用了不同的groupId(javassist对于旧的和org.javassist新的一个,由其导入org.reflections),因此maven将它们作为不同的工件处理.

我只是根据旧库改变了库,以取决于新的库,一切都是固定的!