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
			}
		}
	}

}



  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值