Как получить тип и общий тип из javax.lang.model.VariableElement?

Я использую обработку аннотаций и библиотеку 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);

Некоторое сравнение строк могло бы выполнить работу, но не похоже на идеальный подход.


person Drunken Daddy    schedule 16.08.2020    source источник


Ответы (1)


Вы можете попробовать код ниже.

Для получения этого пользовательского класса вы можете использовать fieldElement.getEnclosingElement(), он даст вам имя класса с полным именем пакета.

Теперь, если вам нужно только имя этого класса, вы можете использовать enclosingElement.getSimpleName().

А чтобы получить приложенныйByElement, вы можете использовать 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

Вы также можете создать один служебный метод, чтобы получить эти два значения.

Это поможет вам.

person Sagar Gangwal    schedule 16.08.2020
comment
fieldElement.getEnclosingElement() не предоставляет User. У меня есть Set<User> users как частная переменная в другом классе. Это дает мне другой класс. Кроме того, из какого пакета происходит Symbol.TypeSymbol? - person Drunken Daddy; 16.08.2020
comment
import com.sun.tools.javac.code.Symbol; Вы можете импортировать это. - person Sagar Gangwal; 16.08.2020
comment
Если вы увидите мою следующую строку fieldElement.getEnclosingElement().getSimpleName(), вы поймете. - person Sagar Gangwal; 16.08.2020
comment
как я уже сказал, fieldElement.getEnclosingElement().getSimpleName() также возвращает имя класса, в котором Set<User> users является частным полем. И получение не может разрешить символ .tsym после импорта com.sun.tools.javac.code.Symbol; - person Drunken Daddy; 16.08.2020
comment
У меня тимвьювер. - person Drunken Daddy; 16.08.2020
comment
Давайте продолжим обсуждение в чате. - person Sagar Gangwal; 16.08.2020