【问题标题】:How to convert an Element from reflection to a Method?如何将元素从反射转换为方法?
【发布时间】:2022-12-31 00:51:29
【问题描述】:

我正在为一个名为“Auditable”的注释构建一个注释处理器。处理器被构建器调用(为了便于阅读,省略了一些部分):

@Override
public boolean process( Set<? extends TypeElement> annotations,
        RoundEnvironment roundEnv ) {

    //--- Obtain all annotated elements
    Set<? extends Element> annotatedElements =
            roundEnv.getElementsAnnotatedWith( Auditable.class );

    //--- Separate elements into classes, fields and methods
    for ( Element element : annotatedElements ) {
        ElementKind kind = element.getKind();
        if ( ElementKind.METHOD.equals( kind ) ) {
            checkAndAddMethod( element );  // <-- Must convert Element to Method
        } 
    ... }

void checkAndAddMethod( Method method ) {  // <-- parameter type = Method

如何将带注释的Element 转换为Method

【问题讨论】:

  • 我认为你不能,因为语言模型代表代码,而反射代表运行中的 JVM。您可以改用ExecutableElement吗?它表示作为语言模型一部分的方法、构造函数或初始化程序。

标签: java reflection annotation-processing


【解决方案1】:

如果注解有足够的数据,如类名、方法名和参数等,那么下面的 sn-p 可以得到一个 Method 对象。

String className = // Get from the annotation attribute
String argumentClassName = // Get from the annotation attribute
String methodName = // Get from the annotation attribute

Class myClass = Class.forName(className);
Class argumentClass = Class.forName(argumentClassName);
Method method = myClass.getDeclaredMethod(methodName, argumentClass);

参考这个link1link2 的例子。

【讨论】:

  • 当前编译的类不会加载到正在编译的 JVM 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
相关资源
最近更新 更多