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

50few1ms  于 2023-03-16  发布在  Java
关注(0)|答案(6)|浏览(142)

我的Reflections库有问题。我尝试动态加载所有实现特定接口的类。只要我不在这些类中使用lambda表达式(java 8),一切都正常(加载所有类)。我尝试升级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>

但不排除是相同的效果。
代码:

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表达式加载类?
抱歉说英语:)

rkue9o1l

rkue9o1l1#

如果您查看此表,您将看到“常量类型:“18”是指标记值为180x12)的CONSTANT_InvokeDynamic属性。
因此,您使用的库具有与Java 8不兼容的类解析器。实际上,这个类解析器甚至与Java 7也不兼容,因为自Java 7以来就指定了这个常量值。它只是侥幸逃脱了这一点,因为普通Java代码在Java 7中不使用此特性。但是,当与JVM的不同编程语言生成的代码交互时,它甚至可能无法与Java 7兼容。
an item in the bug tracker of Reflections描述了您的问题。在底部,您会发现通知:
使用此修复:https://issues.jboss.org/browse/JASSIST-174 javassist支持这个常量,所以在3.18.2-GA中不会出现这个错误。

lskq00tm

lskq00tm2#

我解决了这个问题
首先将javassist jar升级到-〉3.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>
kqqjbcuj

kqqjbcuj3#

我刚刚修复了一个类似的问题。在我的例子中,在我的类路径上有两个javassist jar。我使用maven,它应该避免这种情况,但其中一个依赖项使用了不同的groupId(旧的是javassist,新的是org.javassist,由org.reflections导入),所以maven将它们作为不同的工件处理。
我只是把依赖旧库的库改成依赖新库的库,一切都搞定了!

y1aodyip

y1aodyip4#

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

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

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

dxxyhpgq

dxxyhpgq5#

在Websphere上,我通过为该应用程序启用“parentlast”类加载器来解决这个问题,这样与应用程序打包在一起的JAR就优先于服务器提供的JAR。

bgibtngc

bgibtngc6#

我遇到了这个问题,所以我做了降级暂时从我的jdk,导出JAVA_HOME="/home/user/jdk 1. 7. 0_55”和一切工作正常。

相关问题