|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Поле может быть или типа примитива или ссылочного типа. Есть восемь типов примитивов: boolean, byte, short, int, long, char, float, и double. Ссылочный тип - что-либо, что является прямым или косвенным подклассом java.lang.Object включая интерфейсы, массивы, и перечислимые типы.
import java.lang.reflect.Field;
import java.util.List;
public class FieldSpy<T> {
public boolean[][] b = {{ false, false }, { true, true } };
public String name = "Alice";
public List<Integer> list;
public T val;
public static void main(String... args) {
try {
Class<?> c = Class.forName(args[0]);
Field f = c.getField(args[1]);
System.out.format("Type: %s%n", f.getType());
System.out.format("GenericType: %s%n", f.getGenericType());
// production code should handle these exceptions more gracefully
} catch (ClassNotFoundException x) {
x.printStackTrace();
} catch (NoSuchFieldException x) {
x.printStackTrace();
}
}
}
Демонстрационный вывод, чтобы получить тип трех общедоступных полей в этом class (b, name, и параметризованный тип list), следует. Ввод данных пользователем курсивом.
$ java FieldSpy FieldSpy b Type: class [[Z GenericType: class [[Z $ java FieldSpy FieldSpy name Type: class java.lang.String GenericType: class java.lang.String $ java FieldSpy FieldSpy list Type: interface java.util.List GenericType: java.util.List<java.lang.Integer> $ java FieldSpy FieldSpy val Type: class java.lang.Object GenericType: T
Тип для поля b двумерный массив булевых. Синтаксис для имени типа описывается в Class.getName().
Тип для поля val сообщается как java.lang.Object потому что обобщения реализуются через стирание типа, которое удаляет всю информацию относительно универсальных типов во время компиляции. Таким образом T заменяется верхней границей переменной типа, в этом случае, java.lang.Object.
будет консультироваться с Атрибутом Подписи в файле class, если это будет присутствовать. Если атрибут не доступен, он возвращается который не был изменен введением обобщений. Другие методы в отражении с именем getGenericFoo поскольку некоторое значение Foo реализуется так же.