mardi 3 mars 2015

Why doesn't reflection work when a class returns Lambdas

I have encountered a somewhat strange behaviour. I use annotations to mark certain classes with a particular purpose, and then I use org.reflections library to find all the classes with the particular annotation. However when a class implements a method that returns a lambda function, the reflection won't find the annotated class anymore. The signature of the class is unchanged.


Example of annotation:



@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String someValue();
}


Using the annotation:



@MyAnnotation(someValue = "a")
public class FooBar extends BaseClass {

@Override
public Consumer<Integer> doSomething() {
return null;
}
}



@MyAnnotation(someValue = "bazbar")
public class BarClass extends BaseClass {

@Override
public Consumer<Integer> doSomething(){
return (x) -> {};
}
}


Finding the annotations



private static final Reflections reflections = new Reflections("com.mypackage");

Set<Class<?>> clazzes = reflections.getTypesAnnotatedWith(MyAnnotation.class);


Now - the set 'clazzes' only contains 1 single class, the FooBar class. If I remove the lambda return value from the BazBar class that one too shows up, but as soon as one method in the class returns a lambda the reflection wont work.


I'm lost, any ideas?






Aucun commentaire:

Enregistrer un commentaire