当前位置: 首页 > 知识库问答 >
问题:

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

上官砚文
2023-03-14

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

共有1个答案

秦城
2023-03-14

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

相反,您希望构建一个可以读取这些内容的编译器插件,或者在注释处理器中添加一个任务侦听器-请参见https://stackoverflow.com/a/55288602/860630以了解有关这方面的一些讨论。一旦您完成了这些操作并可以阅读注释,您就可以生成新的代码,然后可以在运行时访问这些代码,并在这里完成您要做的任何事情。

 类似资料:
  • 我想深入研究java反射和hibernate。将值传递给已知的setter是可行的,但我想对hibernate pojo的未知setter也这样做。我使用 这是我的方法,获取一个特定的属性。现在,我想获取属性getter和setter方法。一种方法是获取名称,将get/set与属性名称合并。我不喜欢这种方式,想要一个更好的解决方案。我知道,有一个像myProperty.getSetter这样的函数

  • 主要内容:理解反射的类型(Type)与种类(Kind)在 Go语言中通过调用 reflect.TypeOf 函数,我们可以从一个任何非接口类型的值创建一个 reflect.Type 值。reflect.Type 值表示着此非接口值的类型。通过此值,我们可以得到很多此非接口类型的信息。当然,我们也可以将一个接口值传递给一个 reflect.TypeOf 函数调用,但是此调用将返回一个表示着此接口值的动态类型的 reflect.Type 值。 实际上,r

  • 问题内容: 我有两个字符串: 我通过反思上课 我想要aClass扩展b,例如: 如何实现呢? 如何获得okClass? 谢谢! 问题答案: 除了使用仅通过接口工作的JDK动态代理外,您还可以使用CGLIB或javassist在运行时扩展类。

  • 我有一个类(在我的项目中是一个单例),带有一些变量。我想通过在函数中传递变量的名称来获得其中的一个变量。现在我有:

  • 我使用的库使用类型使用注释向变量添加约束。例如,如果您想要一个可配置的不透明度(以百分比为单位,由表示),您需要注释类型: 我不能让同一个库工作在相同的kotlin代码。 为了简化问题,让我们自己声明注释和用法: 运行会产生,表明类型上存在注释。 如果我们引入一个新的kotlin类,具有类似的字段和注释类型: 之前的检查,现在在类上: 产生,指示JavaAnnot注释不存在于类型的上,尽管我们显然

  • 问题内容: 我需要知道如何在运行时阅读Javadoc注释(可能是通过反射吗?) 说我有以下功能: 在运行时,我可以通过反射获得有关此函数的更多信息。但是无法阅读注释。所以问题是,如何在运行时阅读此 javadoc 注释。 问题答案: 考虑使用注释而不是Javadoc并编写注释处理器。