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

反射-Java 8-无效的常量类型,java,java-8,javassist,reflections,Java,Java 8,Javassist,Reflections,我对图书馆有意见。 我试图动态加载实现特定接口的所有类。 只要我在这些类(Java8)中不使用lambda表达式,一切都正常(所有类都已加载)。 我尝试升级lib版本,但效果相同(java.io.IOException:invalid constant type:18) pom.xml中的依赖项和内置项 <dependency> <groupId>org.reflections</groupId> <artif

我对图书馆有意见。 我试图动态加载实现特定接口的所有类。 只要我在这些类(Java8)中不使用lambda表达式,一切都正常(所有类都已加载)。 我尝试升级lib版本,但效果相同(java.io.IOException:invalid constant type: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>
如何使用lambda表达式加载类

p.S抱歉,英语:)

如果你看一下,你会看到“常量类型:18”指的是标签值为
18
的属性

因此,您使用的是一个具有类解析器的库,该类解析器与Java8不兼容。实际上,这个类解析器甚至与Java 7不兼容,因为这个常量值是从Java 7开始指定的。因为普通Java代码在Java7中没有使用这个特性,所以它没有受到影响。但是,当与JVM的不同编程语言生成的代码交互时,Java 7甚至可能会失败

你的问题是什么。在底部,您将看到通知:

通过此修复:javassist获得了对该常量的支持。因此,对于3.18.2-GA,不会出现此错误


我刚刚解决了一个类似的问题。在我的例子中,在我的类路径上有两个javassist JAR。我使用了maven,它应该避免这种情况,但是其中一个依赖项使用了不同的groupId(
javassist
,旧的使用了
org.javassist
,新的使用了
org.javassist
),所以maven将它们作为不同的工件处理


我刚把旧的图书馆改成新的,一切都修好了

我遇到了这个问题,所以我从jdk中临时降级,导出JAVA_HOME=“/HOME/user/jdk1.7.0_55”,一切正常。

如果使用weblogic,可能与它的类加载器已经加载的库冲突。您可以通过放置

...
<weblogic-web-app>
    <container-descriptor>
        <prefer-application-packages>
            <package-name>javassist.*</package-name>
...
。。。
javassist*
...

在web项目的
weblogic.xml
config文件中。请注意,真正的java包只是
javassist
,而不是
org.javassist
(maven groupId)。

我解决了这个问题

首次将javassist升级到->
3.18.2-GA

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

org.javassist
javassist
3.18.2-GA
其次添加weblogic.xml

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

在Websphere上,我通过为该应用程序启用“parent last”类加载器解决了这个问题,从而使与应用程序打包的JAR优先于服务器提供的JAR。

我看到了这个解决方案,但我使用了这些LIB的最新版本。最后,我删除了反射库,并使用Guava库为类的子类型编写了自己的反射。谢谢你的回复。这里有同样的问题:我在3个框架(HikariCP、Orika和Swagger jaxrs)中有不同版本的javassist,Maven选择了最旧的版本作为自动解析(3.16-1.-GA而不是最新的3.19.0-GA)javassist也在powermockbingo中,在我的案例中,
jersey客户端
jersey核心
传递了它。从2.23.2到2.25.1的所有球衣版本都捆绑了3.18-1.-GA。提交一个GiTuuB.COM/JeSyy/JeSyy/Stase/3618可能的副本,您应该考虑原始问题中的所有限制,降级不是真正解决任何问题。哪一个文件必须是WebSeError?
 <wls:package-name>javassist.*</wls:package-name>