黑马程序员——java语言加强部分——反射之变量

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

概述

    Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段

 一、那么获取一个类的字段的具体步骤:

步骤一、获取类的字节码文件。

步骤二、获取field对象;

        调用Class类中的方法getField(Stringname)和getFields(),来获取field对象

    • Field     getField(String name)返回一个 Field 对象,它反映此 Class对象所表示的类或接口的指定公共成员字段。这里的参数name传递的是变量名。
    •  Field[]   getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此Class 对象所表示的类或接口的所有可访问公共字段。

     注意:这里获得field对象是代表的只是类字节码上的变量,并没有对应到具体的对象上面,需要用它去取某个对象上的值,即执行步骤三。

     步骤三、获取具体对象的上的值;

     1、如果是获取基本数据类型就用以下方法:

    •   boolean    getBoolean(Objectobj) 获取一个静态或实例 boolean 字段的值。
    •   byte getByte(Object obj) 获取一个静态或实例byte 字段的值。
    •   char getChar(Object obj)获取 char 类型或另一个通过扩展转换可以转换为 char 类型的基本类型的静态或实例字段的值。
    •   double      getDouble(Objectobj) 获取 double 类型或另一个通过扩展转换可以转换为 double 类型的基本类型的静或实例字段的值。
    •   float getFloat(Object obj) 获取 float 类型或另一个通过扩展转换可以转换为 float 类型的基本类型的静态或实例字段的值。
    •   int    getInt(Object obj) 获取 int 类型或另一个通过扩展转换可以转换为 int 类型的基本类型的静态或实例字段的值。
    •   long getLong(Object obj)获取 long 类型或另一个通过扩展转换可以转换为 long 类型的基本类型的静态或实例字段的值。
    •   short         getShort(Objectobj)获取 short 类型或另一个通过扩展转换可以转换为 short 类型的基本类型的静态或实例字段的值。

     2、如果不是基本数据类型,是String类或者其他类,则使用方法:

        Object      get(Object obj) 返回指定对象上此Field 表示的字段的值。

     注意:上述方法传递的参数是具体的类的对象。例如:一个类Person,这个Person类可以建立很多对象如p1,p2,p3,……Pn这每个对象都可以都有变量name,age。获取age的值,是用建立的field对象fname来调用具体的get方法。

    具体参考代码如下:

/**Person类中有两个字段name和age*/
Persons p1=new Persons("lisa",23);
    Persons p2=newPersons("lily",22);   
//获取字段age
    Fieldfage=p1.getClass().getField("age");
    int age=fage.getInt(p1);
   System.out.println("age=="+age);   
    //获取字段name
    Fieldfname=p1.getClass().getField("name");//获取name字段
    String str1=(String)fname.get(p1);//获取对象p1上name字段的值
    Fieldfname1=p2.getClass().getField("name");//获取name字段
    String str2=(String)fname1.get(p2);//获取对象p2上name字段的值
    System.out.println("1=="+str1+"*"+str2);
   System.out.println("fname=="+fname.getName()+"*fname1=="+fname1.getName());

      3、上述方法获取的字段都是可见的,如果是不可见的字段,那么我们可以用到调用方法setAccessible(boolean flag) 这样,私有的字段的值我们也可以获取,这叫暴力反射,也叫强取。

 二、其他方法

除了获取具体的对象上的字段值,还可以设置字段值。

 void  set(Object obj, Object value)将指定对象变量上此Field 对象表示的字段设置为指定的新值。

 void         setBoolean(Objectobj, boolean z)将字段的值设置为指定对象上的一个 boolean 值。

 void         setByte(Objectobj, byte b)将字段的值设置为指定对象上的一个 byte 值。

 void         setChar(Objectobj, char c)将字段的值设置为指定对象上的一个 char 值。

 void         setDouble(Objectobj, double d)将字段的值设置为指定对象上的一个 double 值。

 void         setFloat(Objectobj, float f)将字段的值设置为指定对象上的一个 float 值。

 void         setInt(Objectobj, int i)将字段的值设置为指定对象上的一个 int 值。

 void         setLong(Objectobj, long l) 将字段的值设置为指定对象上的一个 long 值。

 void         setShort(Objectobj, short s) 将字段的值设置为指定对象上的一个 short 值。

还有一个方法是用来获取字段的类型:

Class<?>  getType() 返回一个 Class 对象,它标识了此Field 对象所表示字段的声明类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值