我对Reflections库有个问题。我试图动态加载实现特定接口的所有类。只要我没有在这些类中使用lambda表达式(java 8),一切都可以正常工作(所有类都加载)。我尝试了升级库版本,但是效果是一样的(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表达式加载类?
P.S .对不起,英文:)
发布于 2015-05-19 08:23:01
如果您查看this table,您将看到“常量类型:18”指的是标记值为18的CONSTANT_InvokeDynamic属性。
因此,您使用的是一个库,它有一个类解析器,而这个类解析器与Java 8兼容。实际上,这个类解析器甚至不兼容Java 7,因为这个常量值是在Java 7之后指定的,因为普通Java代码在Java 7中没有使用这个特性,但是当与Java 7不同编程语言生成的代码交互时,Java 7甚至可能会失败。
有an item in the bug tracker of Reflections描述了您的问题。在下面,你会发现通知:
通过这个修复:https://issues.jboss.org/browse/JASSIST-174 javassist获得了对这个常量的支持。因此,对于3.18.2-GA,此错误不会发生。
发布于 2018-05-09 16:10:34
我解决了这个问题;
首先将javassist jar升级到-> 3.18.2-GA
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</dependency>第二,添加weblogic.xml
<wls:package-name>javassist.*</wls:package-name>发布于 2016-08-21 18:33:14
我刚解决了一个类似的问题。在我的例子中,我的类路径上有两个javassist。我使用maven,它应该避免这种情况,但其中一个依赖项使用了不同的groupId (javassist用于旧的,org.javassist用于新的,由org.reflections导入),因此maven将它们作为不同的工件处理。
我只是改变了图书馆,依靠旧的依赖于新的,一切都是固定的!
https://stackoverflow.com/questions/30313255
复制相似问题