我有一个问题反思图书馆。
我正在尝试动态加载实现特定接口的所有类。
只要我不在这些类中使用 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>
不排除是同样的效果。
Code:
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 对不起英语:)
如果你看这张桌子,你会看到“constant type: 18”指的是CONSTANT_InvokeDynamic标签值为的属性18
(0x12
).
因此,您使用的库具有与 Java 8 不兼容的类解析器。实际上,这个类解析器甚至不兼容 Java 7,因为这个常量值是从 Java 7 开始指定的。它只是摆脱了这一点,因为普通的 Java 代码在 Java 7 中不使用此功能。但是当与不同的代码生成的代码交互时如果使用 Java 7 的编程语言,它甚至可能会失败。
There’s Reflections 错误跟踪器中的一项描述你的问题。在底部,您会发现通知:
通过此修复:https://issues.jboss.org/browse/JASSIST-174javassist 获得了对此常量的支持。因此,对于 3.18.2-GA,不会发生此错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)