如何通过反射获取函数的java类型注释

如何通过反射获取函数的java类型注释,java,reflection,annotation-processing,functional-interface,Java,Reflection,Annotation Processing,Functional Interface,根据JSR308(Java类型注释),可以使用ElementType.Type\u注释任何类型 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 })

根据JSR308(Java类型注释),可以使用ElementType.Type\u注释任何类型

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>
  }
}
import java.util.function.Consumer;
导入org.junit.Assert;
导入org.junit.Test;
公共类测试注释{
@试验
公开无效测试(){
消费者乐趣=@MyAnnotation(“NoJoke”)TestFunctionAnnotation::test;
Assert.assertEquals(“NoJoke”,fun.getClass().getAnnotatedSuperclass().getAnnotation(MyAnnotation.class));
//预期:但是:
}
}

您的
@MyAnnotation
不会出现在类或方法上,而是出现在类型的使用上—这是您无法思考的。相反,您需要一个假设的“反射”,它可以检查代码本身,而不仅仅是类型的结构


相反,您想要构建一个可以读取该信息的编译器插件,或者在注释处理器中添加一个任务侦听器——请参阅,以获取有关此方面的一些讨论。一旦你完成了这项工作,并且可以阅读注释,你就可以生成新的代码,然后在运行时访问这些代码,并在这里执行任何操作。

你的
@MyAnnotation
不会出现在类或方法上,而是出现在类型的使用上,这是你无法思考的。相反,您需要一个假设的“反射”,它可以检查代码本身,而不仅仅是类型的结构

相反,您想要构建一个可以读取该信息的编译器插件,或者在注释处理器中添加一个任务侦听器——请参阅,以获取有关此方面的一些讨论。完成此操作并可以读取注释后,您就可以生成新代码,然后在运行时访问这些代码,并在此处执行任何操作。

duplicate:duplicate: