首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反射- Java 8-无效常量类型

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

Stack Overflow用户
提问于 2015-05-18 21:40:13
回答 6查看 65.1K关注 0票数 34

我对Reflections库有个问题。我试图动态加载实现特定接口的所有类。只要我没有在这些类中使用lambda表达式(java 8),一切都可以正常工作(所有类都加载)。我尝试了升级库版本,但是效果是一样的(java.io.IOException:无效常量类型: 18)。

pom.xml中的依赖关系和构建

代码语言:javascript
复制
      <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>

不排除也是同样的效果。

代码:

代码语言:javascript
复制
    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表达式加载类?

P.S .对不起,英文:)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-05-19 08:23:01

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

因此,您使用的是一个库,它有一个类解析器,而这个类解析器与Java 8兼容。实际上,这个类解析器甚至不兼容Java 7,因为这个常量值是在Java 7之后指定的,因为普通Java代码在Java 7中没有使用这个特性,但是当与Java 7不同编程语言生成的代码交互时,Java 7甚至可能会失败。

an item in the bug tracker of Reflections描述了您的问题。在下面,你会发现通知:

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

票数 51
EN

Stack Overflow用户

发布于 2018-05-09 16:10:34

我解决了这个问题;

首先将javassist jar升级到-> 3.18.2-GA

代码语言:javascript
复制
  <dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.18.2-GA</version>
  </dependency>

第二,添加weblogic.xml

代码语言:javascript
复制
 <wls:package-name>javassist.*</wls:package-name>
票数 17
EN

Stack Overflow用户

发布于 2016-08-21 18:33:14

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

我只是改变了图书馆,依靠旧的依赖于新的,一切都是固定的!

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30313255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档