我对反射库有问题。我试图动态加载实现特定接口的所有类。只要我不在这些类中使用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不会发生此错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句