我有一个
Reflections库的问题.
我正在尝试动态加载实现特定接口的所有类.
一切工作正常(所有类都被加载),只要我不在这些类中使用lambda表达式(java 8).
我尝试升级lib版本,但效果是一样的(java.io.IOException:无效的常量类型:18).
我正在尝试动态加载实现特定接口的所有类.
一切工作正常(所有类都被加载),只要我不在这些类中使用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表达式加载类?
对不起,英文:)
解决方法
如果您看到
this table,您将看到“常量类型:18”是指标签值为18的
CONSTANT_InvokeDynamic
属性.
所以你使用的库有一个不是Java 8兼容的类解析器.实际上,这个类解析器甚至不是Java 7兼容的,因为这个常量值是从Java 7指定的.由于普通的Java代码在Java 7中不使用这个特性,所以它已经消失了.但是当与不同的JVM的编程语言,甚至可能会与Java 7失败.
有an item in the bug tracker of Reflections描述你的问题.在底部,您会发现通知:
With this fix: 07003 javassist got support for this constant. So with 3.18.2-GA this error doesn’t occur.