Как я могу определить тип универсального поля в Java?

Здесь существует связанный вопрос:

Улучшение Вашего Процесса сборки

Файлы конфигурации идут со способом переопределить настройки:


Вместо того, чтобы регистрироваться в двух файлах (или больше), Вы только регистрируетесь в файле конфигурации по умолчанию, и затем на каждой целевой машине, Вы помещаете Local.config только с разделом appSettings, который имеет переопределения для той конкретной машины.

при использовании разделов конфигурации эквивалент:

configSource="Local.config"

, Конечно, это - хорошая идея сделать резервные копии всех файлов Local.config от других машин и регистрировать их где-нибудь, но не как часть фактических решений. Каждый разработчик помещает "игнорировать" на файл Local.config, таким образом, это не становится зарегистрированным, который перезаписал бы всех файл else.

(Вы не должны на самом деле называть его "Local.config", это, что я использую)

34
задан Juan Mendes 1 September 2016 в 21:25
поделиться

4 ответа

Взгляните на Получение типов полей из Руководства по Java След: API отражения .

По сути, вам нужно получить все java.lang.reflect.Field вашего класса и вызвать Field # getType () для каждого из них. (проверьте правку ниже). Чтобы получить все поля объекта , включая общедоступные, защищенные, пакетные и частные поля доступа, просто используйте Class.getDeclaredFields () . Примерно так:

for (Field field : Person.class.getDeclaredFields()) {
    System.out.format("Type: %s%n", field.getType());
    System.out.format("GenericType: %s%n", field.getGenericType());
}

РЕДАКТИРОВАТЬ: Как указано в комментарии wowest , вам действительно нужно вызвать Поле # getGenericType () , проверьте, является ли возвращенный Тип ParameterizedType , а затем выберите соответствующие параметры. Используйте ParameterizedType # getRawType () и ParameterizedType # getActualTypeArgument () , чтобы получить необработанный тип и массив аргументов типов ParameterizedType соответственно. Следующий код демонстрирует это:

for (Field field : Person.class.getDeclaredFields()) {
    System.out.print("Field: " + field.getName() + " - ");
    Type type = field.getGenericType();
    if (type instanceof ParameterizedType) {
        ParameterizedType pType = (ParameterizedType)type;
        System.out.print("Raw type: " + pType.getRawType() + " - ");
        System.out.println("Type args: " + pType.getActualTypeArguments()[0]);
    } else {
        System.out.println("Type: " + field.getType());
    }
}

И выводит:

Field: name - Type: class java.lang.String
Field: children - Raw type: interface java.util.List - Type args: class foo.Person
56
ответ дан 27 November 2019 в 16:36
поделиться

Вот пример, который отвечает на мой вопрос

class Person {
  public final String name;
  public final List<Person> children;  
}

//in main
Field[] fields = Person.class.getDeclaredFields();
for (Field field : fields) {
  Type type = field.getGenericType();
  System.out.println("field name: " + field.getName());
  if (type instanceof ParameterizedType) {
    ParameterizedType ptype = (ParameterizedType) type;
    ptype.getRawType();
    System.out.println("-raw type:" + ptype.getRawType());
    System.out.println("-type arg: " + ptype.getActualTypeArguments()[0]);
  } else {
    System.out.println("-field type: " + field.getType());
  }
}

Это выводит

field name: name
-field type: class java.lang.String
field name: children
-raw type:interface java.util.List
-type arg: class com.blah.Person
5
ответ дан 27 November 2019 в 16:36
поделиться

возьмите этот фрагмент:

 for (Field field : Person.class.getFields()) {
        System.out.println(field.getType());
 }

ключевым классом является Поле

3
ответ дан 27 November 2019 в 16:36
поделиться

Как указывает dfa, вы можете получить стертый тип с помощью java.lang.reflect.Field.getType . Вы можете получить общий тип с помощью Field.getGenericType (который может иметь подстановочные знаки, связанные общие параметры и все виды безумия). Вы можете получить поля через Class.getDeclaredFields ( Class.getFields предоставит вам общедоступные поля (включая поля supertpye) - бессмысленно). Чтобы получить поля базового типа, пройдите Class.getSuperclass . Примечание для проверки модификаторов из Field.getModifiers - статические поля, вероятно, вам не будут интересны.

1
ответ дан 27 November 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: