如何从 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 方法来获取这两个值。
这对你有帮助。
我正在使用注释处理和 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 方法来获取这两个值。
这对你有帮助。