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

问题描述

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

说,我有一个

VariableElement fieldElement

如果

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

打印

类型:-java.util.Set

如何获取Set类和User类,以便可以使用javapoet做类似的事情?

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

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

解决方法

您可以尝试以下代码。

要获取该用户类,您可以使用 fieldElement.getEnclosingElement() ,它将为您提供包含完整程序包名称的类名称。

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

要获取被包围的元素,您可以使用[JS]。只需将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方法来获取这两个值。

这将为您提供帮助。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...