簡體   English   中英

如何通過反射獲取函數的java類型注釋

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM