zoukankan      html  css  js  c++  java
  • Java反射之Field用法

    Java反射中Field用于获取某个类的属性或该属性的属性值

    一:如何通过Field反射获取类的属性


     Field提供如下几种方法:

    :1:Class.getDeclaredField(String name);

    返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段(包括私有成员)。

    2:Class.getDeclaredFields();

     返回 Field 对象的一个数组,该数组包含此 Class 对象所表示的类或接口所声明的所有字段(包括私有成员)。

    3:Class.getField(String name);

    返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

    4:Class.getFields();

    返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段。


    下面一个例子说明如何通过Field反射获取类中的属性

    我们先定义一个普通类Person 

    包含三个属性 公有name 私有age、sex

    1. package com.mao.test;  
    2.   
    3. public class Person   
    4. {  
    5.     public String name;  
    6.     private Integer age;  
    7.     private String sex;  
    8.     //省略所有属性的set、get方法  


    下面开始通过Field反射的各方法访问属性

    1. package com.mao.test;  
    2.   
    3. import java.lang.reflect.Field;  
    4.   
    5. public class Test   
    6. {  
    7.     public static void main(String[]args) throws NoSuchFieldException, SecurityException  
    8.     {  
    9.         Person person =new Person();  
    10.         //通过Class.getDeclaredField(String name)获取类或接口的指定已声明字段。  
    11.         Field f1=person.getClass().getDeclaredField("name");  
    12.         System.out.println("-----Class.getDeclaredField(String name)用法-------");  
    13.         System.out.println(f1);  
    14.         System.out.println("-----Class.getDeclaredFields()用法-------");  
    15.         //通过Class.getDeclaredFields()获取类或接口的指定已声明字段。  
    16.         Field []f2=person.getClass().getDeclaredFields();  
    17.         for(Field field:f2)  
    18.         {  
    19.             System.out.println(field);  
    20.         }  
    21.         System.out.println("-----Class.getField(String name)用法-------");  
    22.         //通过Class.getField(String name)返回一个类或接口的指定公共成员字段,私有成员报错。  
    23.         Field f3=person.getClass().getField("name");  
    24.         System.out.println(f3);  
    25.         //如果获取age属性(私有成员) 则会报错  
    26.         //Field f3=person.getClass().getField("name");  
    27.         System.out.println("-----Class.getFields()用法-------");  
    28.         //通过Class.getField(),返回 Class 对象所表示的类或接口的所有可访问公共字段。  
    29.         Field []f4=person.getClass().getFields();  
    30.         for(Field fields:f4)  
    31.         {  
    32.             //因为只有name属性为共有,因此只能遍历出name属性  
    33.             System.out.println(fields);  
    34.         }  
    35.     }  
    36. }  

    通过上面程序也可以发现Class.getField(String name)和Class.getFields()都只能返回公有属性,如果访问私有属性就会报错java.lang.NoSuchFieldException。

    运行结果:

    [plain] view plain copy 在CODE上查看代码片派生到我的代码片
    1. -----Class.getDeclaredField(String name)用法-------  
    2. public java.lang.String com.mao.test.Person.name  
    3. -----Class.getDeclaredFields()用法-------  
    4. public java.lang.String com.mao.test.Person.name  
    5. private java.lang.Integer com.mao.test.Person.age  
    6. private java.lang.String com.mao.test.Person.sex  
    7. -----Class.getField(String name)用法-------  
    8. public java.lang.String com.mao.test.Person.name  
    9. -----Class.getFields()用法-------  
    10. public java.lang.String com.mao.test.Person.name  


    二:获取属性的属性值并修改属性值

    获取属性的值用get(Object obj)的方法,但是获取私有属性的时候必须先设置Accessible为true,然后才能获取。

    下面咱们获取Person各属性的属性值并将姓名属性值修改

    Test.java

    1. package com.mao.test;  
    2.   
    3. import java.lang.reflect.Field;  
    4.   
    5. public class Test   
    6. {  
    7.     public static void main(String[]args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException  
    8.     {  
    9.         Person person =new Person();  
    10.         person.setName("VipMao");  
    11.         person.setAge(24);  
    12.         person.setSex("男");  
    13.         //通过Class.getDeclaredField(String name)获取类或接口的指定属性值。  
    14.         Field f1=person.getClass().getDeclaredField("name");  
    15.         System.out.println("-----Class.getDeclaredField(String name)用法-------");  
    16.         System.out.println(f1.get(person));  
    17.         System.out.println("-----Class.getDeclaredFields()用法-------");  
    18.         //通过Class.getDeclaredFields()获取类或接口的指定属性值。  
    19.         Field []f2=person.getClass().getDeclaredFields();  
    20.         for(Field field:f2)  
    21.         {  
    22.             field.setAccessible(true);  
    23.             System.out.println(field.get(person));  
    24.         }  
    25.         //修改属性值  
    26.         System.out.println("----修改name属性------");  
    27.         f1.set(person, "Maoge");  
    28.         //修改后再遍历各属性的值  
    29.         Field []f3=person.getClass().getDeclaredFields();  
    30.         for(Field fields:f3)  
    31.         {  
    32.             fields.setAccessible(true);  
    33.             System.out.println(fields.get(person));  
    34.         }  
    35.           
    36.     }  
    37. }  


    从上面程序我们得知,通过get(Object obj)获取属性的值,通过set(Object obj,value)重新设置新的属性值,并且当我们需要获取私有属性的属性值得时候,我们必须设置Accessible为true,然后才能获取。

    运行结果:

    [plain] view plain copy 在CODE上查看代码片派生到我的代码片
      1. -----Class.getDeclaredField(String name)用法-------  
      2. VipMao  
      3. -----遍历属性值-------  
      4. VipMao  
      5. 24  
      6. 男  
      7. ----修改name属性后再遍历属性值------  
      8. Maoge  
      9. 24  
      10. 男 
  • 相关阅读:
    129. Sum Root to Leaf Numbers
    113. Path Sum II
    114. Flatten Binary Tree to Linked List
    112. Path Sum
    100. Same Tree
    300. Longest Increasing Subsequence
    72. Edit Distance
    自定义js标签库
    JS 实现Table相同行的单元格自动合并示例代码
    mysql 高版本only_full_group_by 错误
  • 原文地址:https://www.cnblogs.com/ldq2016/p/6834643.html
Copyright © 2011-2022 走看看