[英]How to get java type annotation of functional by reflection
根据 JSR 308(Java 类型注释),可以使用 ElementType.TYPE_USE 注释任何类型:
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Target({ TYPE_USE })
@Retention(RUNTIME)
public @interface MyAnnotation {
String value();
}
如何在运行时从函数中获取注释值?
import java.util.function.Consumer;
import org.junit.Assert;
import org.junit.Test;
public class TestFunctionAnnotation {
@Test
public void test() {
Consumer<TestFunctionAnnotation> fun = @MyAnnotation("NoJoke") TestFunctionAnnotation::test;
Assert.assertEquals("NoJoke", fun.getClass().getAnnotatedSuperclass().getAnnotation(MyAnnotation.class));
// expected:<NoJoke> but was:<null>
}
}
您的@MyAnnotation
不会出现在类或方法中,而是出现在类型的使用上——这是您无法反思的。 相反,您需要一个假设的“反射”来检查代码本身,而不仅仅是类型的结构。
相反,您想要构建一个可以读取它的编译器插件,或者在注释处理器中添加一个任务侦听器 - 有关此问题的一些讨论,请参见https://stackoverflow.com/a/55288602/860630 。 完成此操作并可以读取注释后,您可以生成新代码,然后您可以在运行时访问这些代码,并在此处执行任何您想要的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.