当前位置: 首页 > 面试题库 >

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

刘承悦
2023-03-14
问题内容

我对反射库有问题。我试图动态加载实现特定接口的所有类。只要我不在这些类中使用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不会发生此错误。



 类似资料:
  • 问题内容: 我有一个有一堆常量字符串的类。 我需要通过反射加载此类并检索这些常量。我可以起床: 但是我对如何检索此类中的字段感到困惑。 问题答案: 访问字段的快速样本-

  • 主要内容:1 Java8 方法参数反射的介绍,2 Method类,3 Method类的方法,4 Parameter类,5 Parameter类的方法,6 Java8 方法参数反射的案例1 Java8 方法参数反射的介绍 Java提供了一项新功能,您可以在其中获得任何方法或构造函数的形式参数的名称。java.lang.reflect包包含所有必需的类,例如Method和Parameter,可用于参数反射。 2 Method类 Method类提供有关类或接口上的单个方法的信息。反射的方法可以是类方法

  • 问题内容: 我正在创建一个cli工具来管理现有应用程序。应用程序和测试都可以正常运行,但尽管如此,但是运行jar中存在的cli工具时却收到javassist失败: 由于我知道jar可以很好地进行单元测试和集成测试,因此我认为javassist可能存在问题,因此我尝试了cglib。然后,字节码提供程序显示为cglib,但是我仍然得到与其中存在javassist完全相同的堆栈跟踪。 cglib肯定在类

  • 我正在尝试用C重新创建vector类 我在函数at()中得到这个错误; “int”类型的非常量引用的初始化无效 即使函数应该返回引用,也不能将指针作为地址返回吗? 代码如下所示:

  • 为什么上面的无效字符是常量,这在JavaScript中工作得很完美。我想显示英尺和英寸的高度,并且使用了这个客户端,但是当我在服务器端使用相同的高度时,它显示。

  • 我有一个项目。它使用了、和maven。可以使用成功构建它。 要运行Spring引导应用程序,我使用了命令 但它错误地失败了 我为start命令添加了额外的参数 但是当我运行它时,我得到了这个错误 到底是什么问题?