2

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

说,我有一个

VariableElement fieldElement

而如果

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

印刷

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

我如何获得 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);

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

4

1 回答 1

2

你可以试试下面的代码。

为了获得您可以使用的 User 类fieldElement.getEnclosingElement(),它将为您提供具有完整包名的类名。

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

并且要获得被封闭的元素,您可以使用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

您还可以创建一种实用程序方法来获取这两个值。

这将对您有所帮助。

于 2020-08-16T16:38:18.800 回答