gpt4 book ai didi

java - 在编译时获取处理器内部方法调用(ExecutableElement)的参数类

转载 作者:行者123 更新时间:2023-12-02 02:05:25 25 4
gpt4 key购买 nike

我有一个类,其中有一个带有自定义注释的方法,该方法在编译时使用处理器进行处理。

@Controller
public class ExampleController {

@ListenFor
public void handleRequest(Object something, String other) {

}
}

我想验证该方法所期望的第二个参数的类,并确保它是String

在处理器内部,我获取该方法的可执行元素,并从中获取参数作为 VariableElements:

ExecutableElement exeElement = (ExecutableElement) e;

List<? extends VariableElement> params = exeElement.getParameters();

如何在处理器内编译时获取第二个参数(String other)的类,以便我可以将其与 String 类进行比较并验证它?

最佳答案

由于您在编译时操作,因此不一定依赖 Class实例。相反,编译时类型有另一种表示形式,称为 TypeMirror .

我们可以获得ElementTypeMirror通过Element#asType() 。由于上述原因,无法从 TypeMirror 获取 Class 对象。为了检查第二个参数是否为String,我们需要将String.class转换为TypeMirror。方法Elements#getTypeElement(CharSequence name)给我们一个TypeMirror,并给出一个规范的名称。我们可以通过Class#getCanonicalName()获取Class实例的规范名称.

这会产生以下代码:

// assuming the processingEnvironment got passed to the method.
// It is a good idea to store the elementUtil somewhere
// globally accessible during annotation processing.
Elements elementUtils = processingEnvironment.getElementUtils();
...
TypeMirror stringType =
elementUtils.getTypeElement(String.class.getCanonicalName()).asType();
...
ExecutableElement exeElement = (ExecutableElement) e;
List<? extends VariableElement> params = exeElement.getParameters();
TypeMirror secondArgumentType = params.get(1).asType();

// I find the explicit version has a less cognitive complexity. Feel free to change it.
if (secondArgumentType.equals(stringType) == false) {
// TODO: halt and catch fire!
}

// from here on, you can be certain that the second argument is a String.
...

关于java - 在编译时获取处理器内部方法调用(ExecutableElement)的参数类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50889720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com