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

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

依赖并在pom.xml中构建

 org.reflections reflections 0.9.10   javassist javassist     org.javassist javassist 3.19.0-GA     org.apache.maven.plugins maven-compiler-plugin  1.8 1.8     

没有排除是相同的效果。

码:

  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而失败。

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

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

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

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

我解决了这个问题;

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

   org.javassist javassist 3.18.2-GA  

其次添加weblogic.xml

  javassist.* 

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

 ...    javassist.* ... 

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

我有这个问题,所以我暂时从我的jdk,EXPORT JAVA_HOME =“/ home / user / jdk1.7.0_55”进行了降级,一切正常。