Здесь существует связанный вопрос:
Улучшение Вашего Процесса сборки
Файлы конфигурации идут со способом переопределить настройки:
Вместо того, чтобы регистрироваться в двух файлах (или больше), Вы только регистрируетесь в файле конфигурации по умолчанию, и затем на каждой целевой машине, Вы помещаете Local.config только с разделом appSettings, который имеет переопределения для той конкретной машины.
при использовании разделов конфигурации эквивалент:
configSource="Local.config"
, Конечно, это - хорошая идея сделать резервные копии всех файлов Local.config от других машин и регистрировать их где-нибудь, но не как часть фактических решений. Каждый разработчик помещает "игнорировать" на файл Local.config, таким образом, это не становится зарегистрированным, который перезаписал бы всех файл else.
(Вы не должны на самом деле называть его "Local.config", это, что я использую)
Взгляните на Получение типов полей из Руководства по 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
Вот пример, который отвечает на мой вопрос
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
возьмите этот фрагмент:
for (Field field : Person.class.getFields()) {
System.out.println(field.getType());
}
ключевым классом является Поле
Как указывает dfa, вы можете получить стертый тип с помощью java.lang.reflect.Field.getType
. Вы можете получить общий тип с помощью Field.getGenericType
(который может иметь подстановочные знаки, связанные общие параметры и все виды безумия). Вы можете получить поля через Class.getDeclaredFields
( Class.getFields
предоставит вам общедоступные поля (включая поля supertpye) - бессмысленно). Чтобы получить поля базового типа, пройдите Class.getSuperclass
. Примечание для проверки модификаторов из Field.getModifiers
- статические поля, вероятно, вам не будут интересны.