掌财社:简述Java反射Field类 及全方位解析使用方法

本文深入探讨了Java反射中的Field类,包括获取成员变量的类型、修饰符,以及如何在运行时安全地获取和修改成员变量的值。通过实际示例展示了在处理基本类型、引用类型时的注意事项,如错误处理、类型转换和访问权限控制。
摘要由CSDN通过智能技术生成

在 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)解码成字符串

实例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45378258

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值