在 Java 语言中的反射机制非常之重要,作为反射可用方法之一的 Field 类提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。本文将和大家分享一下 Java 反射机制中的 Field 类和具体使用方法。
Field 成员变量的介绍
每个成员变量有类型和值。
java.lang.reflect.Field 为我们提供了获取当前对象的成员变量的类型,和重新设值的方法。
获取变量的类型
类中的变量分为两种类型:基本类型和引用类型:
基本类型( 8 种)
整数:byte, short, int, long
浮点数:float, double
字符:char
布尔值:boolean
引用类型
所有的引用类型都继承自 java.lang.Object
类,枚举,数组,接口都是引用类型
java.io.Serializable 接口,基本类型的包装类(比如 java.lang.Double)也是引用类型
java.lang.reflect.Field 提供了两个方法获去变量的类型:
Field.getType():返回这个变量的类型
Field.getGenericType():如果当前属性有签名属性类型就返回,否则就返回 Field.getType()
实例:
Class<?> getType()
返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
Type getGenericType()
返回一个 Type 对象,它表示此 Field 对象所表示字段的声明类型。
测试类:
public class A
{
public String id;
protected String name;
int age;
private String sex;
int[][] ints;
}
main方法:
public class Test
{
/**
* 返回该类所在包的包名字字符串
* @param thisClass 一个类的Class对象
* @return 该类的包名字字符串
*/
public static String getThisPackageName(Class<?> thisClass)
{
String thisClassName=thisClass.getName();
String thispackage=thisClassName.substring(0,thisClassName.lastIndexOf("."));
return thispackage;
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException
{
Class strClass=Class.forName(getThisPackageName(Test.class)+".A");
//获取类的所有声明的字段
Field[] sField=strClass.getDeclaredFields();
for (Field field : sField)
{
//获取字段的名字
System.out.printf("Field:%-4s|",field.getName());
//获取字段的类型的Class类,然后获取规范化的名字
System.out.printf("Type:%-18s|",field.getType().getCanonicalName());
//获取字段的类型的Type类对象,然后获取类的名字
System.out.printf("GenericType:%-18s|",field.getGenericType().getTypeName());
System.out.println();
}
}
}
运行结果:
Field:id |Type:java.lang.String |GenericType:java.lang.String |
Field:name|Type:java.lang.String |GenericType:java.lang.String |
Field:age |Type:int |GenericType:int |
Field:sex |Type:java.lang.String |GenericType:java.lang.String |
Field:ints|Type:int[][] |GenericType:int[][] |
可以看到这个两个方法都能正确的返回当前字段的类型。这两个方法的区别还是在返回类型上
getType()方法返回的是Class<?>类型的,而getGenericType()返回的是Type类型的。
获取成员变量的修饰符
成员变量可以被以下修饰符修饰:
访问权限控制符:public, protected, private
限制只能有一个实例的:static
不允许修改的:final
不会被序列化:transient
线程共享数据的一致性:volatile
注解
类似获取 Class 的修饰符,我们可以使用 Field.getModifiers() 方法获取当前成员变量的修饰符。
返回 java.lang.reflect.Modifier 中定义的整形值。然后使用 Modifier.toString(int mod)解码成字符串
实例: