Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reflections - Java 8 - invalid constant type

I have a problem with Reflections library. I am trying to load dynamically all classes which implement specific interface. Everything works fine (all classes are loaded) as long as I do not use lambda expression in these classes (java 8). I tried upgrade lib version but effect was the same (java.io.IOException: invalid constant type: 18).

Dependency and build in 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> 

without exclusion is the same effect.

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); 

How can I load classes with lambda expression?

P.S Sorry for English :)

like image 779
Lukasz Avatar asked May 18 '15 21:05

Lukasz


2 Answers

If you look at this table, you’ll see that “constant type: 18” refers to the CONSTANT_InvokeDynamic attribute whose tag value is 18.

So you are using a library which has a class parser which is not Java 8 compatible. Actually, this class parser even isn’t Java 7 compatible as this constant value is specified since Java 7. It just got away with that as ordinary Java code doesn’t use this feature in Java 7. But when interacting with code produced by different programming languages for the JVM, it could even fail with Java 7.

There’s an item in the bug tracker of Reflections describing your problem. At the bottom, you will find the notice:

With this fix: https://issues.jboss.org/browse/JASSIST-174 javassist got support for this constant. So with 3.18.2-GA this error doesn't occur.

like image 94
Holger Avatar answered Sep 21 '22 23:09

Holger


I solved this problem that;

First upgrade javassist jar to -> 3.18.2-GA

  <dependency>     <groupId>org.javassist</groupId>     <artifactId>javassist</artifactId>     <version>3.18.2-GA</version>   </dependency> 

Secondly add weblogic.xml

 <wls:package-name>javassist.*</wls:package-name> 
like image 34
mehmetunluu Avatar answered Sep 22 '22 23:09

mehmetunluu