【问题标题】:How to get java type annotation of functional by reflection如何通过反射获取函数的java类型注释
【发布时间】:2020-02-06 15:22:01
【问题描述】:

根据 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>
  }
}

【问题讨论】:

标签: java reflection annotation-processing functional-interface


【解决方案1】:

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

相反,您想要构建一个可以读取它的编译器插件,或者在注释处理器中添加一个任务侦听器 - 有关此问题的一些讨论,请参见 https://stackoverflow.com/a/55288602/860630。完成此操作并可以读取注释后,您就可以生成新代码,然后您可以在运行时访问这些代码,然后在此处执行任何操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2020-11-15
    相关资源
    最近更新 更多