【发布时间】:2015-03-03 21:29:01
【问题描述】:
我遇到了一个有点奇怪的行为。我使用注释来标记具有特定目的的某些类,然后我使用 org.reflections 库来查找具有特定注释的所有类。但是,当一个类实现一个返回 lambda 函数的方法时,反射将不再找到带注释的类。类的签名没有改变。
注释示例:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String someValue();
}
使用注释(编辑 - 添加 BaseClass):
public class BaseClass {
public Consumer<Integer> doSomething(){ return null;}
}
@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) -> {};
}
}
查找注释
private static final Reflections reflections = new Reflections("com.mypackage");
Set<Class<?>> clazzes = reflections.getTypesAnnotatedWith(MyAnnotation.class);
现在 - 'clazzes' 集仅包含 1 个单一类,即 FooBar 类。如果我从 BazBar 类中删除同样显示的 lambda 返回值,但是一旦类中的一个方法返回 lambda,反射将不起作用。
我迷路了,有什么想法吗?
【问题讨论】:
-
如果你
return new Conumser<Integer> () { ... };可以吗? -
是的,如果 return new Consumer
() {...} 它可以工作,那么两个类都会出现在反射中,但是当使用 lambda 表达式时它不会出现. -
我在一个简单的设置中使用了你的代码,
clazzes包含两个类FooBar和BarClass。我使用了reflections0.9.9 版。你的BaseClass.java怎么样? -
我已经使用 BaseClass 更新了上面的示例 - 我使用了 0.9.9-RC1,但无法使其工作......
-
@Idlewood 用
0.9.9-RC1尝试了您的示例,并且可以确认它不起作用。因此,将版本从0.9.9-RC1更新为0.9.9即可。
标签: java reflection lambda annotations java-8