Field类详解
Field表示类中的成员变量
一、Field类的定义
//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 } } } }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了