- //AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。
- public class AccessibleObject implements AnnotatedElement {
- /*
- * 1、实现了AnnotatedElement对注解支持的相关方法
- * 2、提供访问控制
- /
- void setAccessible(boolean flag)
- 设置该对象(Field,Constructor,Method)是否可访问
- boolean isAccessible()
- 该对象是否可访问
- void setAccessible(AccessibleObject[] array, boolean flag)
- 设置这一组对象(Field,Constructor,Method)是否可访问
- }
- public interface Member{
- public static final int PUBLIC = 0; //标识类或接口的所有已声明成员的集合。
- public static final int DECLARED = 1; //标识类或接口的所有公共成员(包括继承成员)的集合。
- public Class<?> getDeclaringClass();// 所在类
- public String getName(); //返回此 Member 表示的底层成员或构造方法的简单名称。
- public int getModifiers(); //作为整数返回由此 Member 所表示的成员或构造方法的 Java 语言修饰符。
- public boolean isSynthetic(); //如果此成员是编译器引入的,则返回 true;否则,返回 false。
- }
- public final class Field extends AccessibleObject implements Member{
- // 1.字段的设值和取值 ,对于静态属性,obj传null
- set(Object obj, Object value)
- setXX(Object obj, Object value) ,比如setInt,setBoolean
- Object get(Object obj)
- getXX(Object obj) ,比如getInt,getBoolean
- // 2.字段上注解的获取
- getDeclaredAnnotations()
- getAnnotation(Class<T> annotationClass);
- // 3.字段类型
- Type getGenericType();
- Class<?> getType();
- // 4.字段修饰符
- int modifer=field.getModifiers();
- String modify = Modifier.toString(modifiers);
- // 5.字段名称
- String getName();
- }
二、Field类实例
- package reflect;
- import java.lang.annotation.Annotation;
- import java.lang.reflect.Field;
- import java.lang.reflect.Modifier;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.lang.reflect.TypeVariable;
- import java.lang.reflect.WildcardType;
- import java.util.Arrays;
- import java.util.List;
- /**
- * @author zhangquanit
- */
- public class FieldTest {
- private int mInt; // 普通成员变量
- public static String mStr; // 静态成员变量
- @MyAnnotation
- private Object mObject; // 使用了注解的成员变量
- private List<String> mList; // 泛型字段
- public static void main(String[] args) throws Exception {
- FieldTest obj = new FieldTest();
- Class<? extends FieldTest> clazz = obj.getClass();
- /*
- * 普通属性字段的设置和获取
- */
- Field normalField = clazz.getDeclaredField("mInt");
- setAccessible(normalField);
- String filedName=normalField.getName();//mInt
- normalField.set(obj, 100); // 设值
- int mIntValue = normalField.getInt(obj);// 取值 100;
- /*
- * 静态属性字段的设值和获取 (obj传null)
- */
- Field staticField = clazz.getDeclaredField("mStr");
- setAccessible(staticField);
- staticField.set(null, "static value");
- Object value = staticField.get(null);// static value
- /*
- * 字段的枚举相关操作 (更多相关信息参照 我写的 Java注解)
- */
- Field annotationField = clazz.getDeclaredField("mObject");
- setAccessible(annotationField);
- Annotation[] declaredAnnotations = annotationField
- .getDeclaredAnnotations();
- System.out.println(Arrays.toString(declaredAnnotations));
- /*
- * 泛型字段
- */
- Field genericField = clazz.getDeclaredField("mList");
- setAccessible(genericField);
- Type genericType = genericField.getGenericType();// java.util.List<java.lang.String>
- Class type = genericField.getType(); // interface java.util.List
- getActualType(genericType); //Class类型: class java.lang.String
- }
- // 私有的变量,需要设置为可访问
- private static void setAccessible(Field field) {
- if (!field.isAccessible()) {
- field.setAccessible(true);
- }
- }
- // 获取List中泛型的实际类型
- private static void getActualType(Type genericType) {
- if (genericType instanceof ParameterizedType) {
- ParameterizedType parameterizedType = (ParameterizedType) genericType;
- Type actualType = parameterizedType.getActualTypeArguments()[0];
- if (actualType instanceof TypeVariable) {// 泛型类型,比如T
- TypeVariable typeVariable = (TypeVariable) actualType;
- System.out.println("TypeVariable类型: " + typeVariable);
- } else if (actualType instanceof WildcardType) {// 含通配符? 类型
- WildcardType wildcardType = (WildcardType) actualType;
- System.out.println("WildcardType类型: " + wildcardType);
- } else if (actualType instanceof Class) { // 普通类对象
- Class cls = (Class) actualType;
- System.out.println("Class类型: " + actualType); // class
- // java.lang.String
- }
- }
- }
- }