如何从 javax.lang.model.VariableElement 获取类型和泛型?

How to get type and generic type from javax.lang.model.VariableElement?

我正在使用注释处理和 javapoet 库生成一些源代码。

说,我有一个

VariableElement fieldElement

如果

System.out.println("type:- " + fieldElement.asType().toString());

打印

type:- java.util.Set<com.example.demo.test.model.User>

如何获得集合 class 和用户 class 以便我可以用 javapoet 做这样的事情?

ClassName user = ClassName.get("com.example.demo.test.model", "User");
ClassName set = ClassName.get("java.util", "Set");
TypeName setOfUsers = ParameterizedTypeName.get(set, user);

一些字符串比较可以完成工作,但似乎不是理想的方法。

您可以试试下面的代码。

要获得该用户 class,您可以使用 fieldElement.getEnclosingElement(),它会给您 class 名称和完整的包名称。

现在,如果您只想要 class 的名称,您可以使用 enclosingElement.getSimpleName().

要获得 enclosedByElement,您可以使用 TypeSymbol。只需将 fieldElement.asType() 转换为 Type 并获得 tsym 属性。

        VariableElement fieldElement;

        Symbol.TypeSymbol containerForEnclosingElement=((Type)fieldElement.asType()).tsym;
        Element enclosingElement=fieldElement.getEnclosingElement();

        System.out.println("containerForEnclosingElement:- " +  containerForEnclosingElement);
        System.out.println("enclosingElement:- " +  enclosingElement);
        System.out.println("enclosingElement Name:- " +  enclosingElement.getSimpleName());
        System.out.println("fieldElement without root Type:- "+((Type) fieldElement.asType()).getTypeArguments().get(0));

以上代码将打印输出如下。

containerForEnclosingElement:- java.util.Set
enclosingElement:- com.example.demo.test.model.User.
enclosingElement Name:- User
fieldElement without root Type:- com.example.demo.test.model.User

您也可以创建一个 Utility 方法来获取这两个值。

这对你有帮助。