【问题标题】:Using Java Annotation Processor To Understand Parameterized Types Of Method Parameters使用 Java 注释处理器来理解方法参数的参数化类型
【发布时间】:2019-04-24 16:26:53
【问题描述】:

我正在尝试使用注释处理器来验证注释,并且作为该工作的一部分,我正在尝试弄清楚如何使用 API 来确定 ExecutableElement 的参数是否是参数化类型(例如 List),如果是,参数化类型是什么 (Foo)。

除了解析 ve.asType().toString() 给出的字符串(其中 VariableElement ve 是 ExecutableElement e.getParameters() 的一个元素)之外,还有其他方法吗?最好能更好地处理这些类型,而不仅仅是一个字符串。

【问题讨论】:

    标签: java annotations annotation-processing


    【解决方案1】:

    这个想法是知道什么时候转换成什么,在你的情况下你需要获得泛型类型参数,所以你需要转换成DeclaredType

    例如对于如下的方法

    @SampleAnno
    public void something(List<String> paramx){
    
    }
    

    这样的处理器中的代码

    ExecutableElement method = (ExecutableElement) this.sampleElement;
    
    method.getParameters()
            .forEach(parameter -> ((DeclaredType)parameter.asType()).getTypeArguments()
                    .forEach(typeMirror -> {
                     messager.printMessage(Diagnostic.Kind.NOTE, "::::::: > [" + typeMirror.toString() + "]");
                    }));
    

    应该打印 Information:java: ::::::: &gt; [java.lang.String]

    【讨论】:

    • 唯一警告:在这里,就像问题中一样,要非常小心toString(),有时这不正确(例如Eclipse的JDT)。相反,请考虑类似 JavaPoet 的 TypeName.get(...)ClassName.get(...),它们确实具有良好、一致的 toString()。
    • @ColinAlworth 是的,你是对的..我这样做只是为了演示我可以从参数的泛型类型中获取 typeMirror..但通常我会用它做一些有用的事情.. 我总是使用 JavaPoet 。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多