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. 男 
  • 相关阅读:
    org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standard
    mybatis plus 代码生成器
    ServerU FTP服务器无法上传中文名文件怎么办
    关于java文件下载文件名乱码问题解决方案
    使用Redis模拟简单分布式锁,解决单点故障的问题
    springboot定时任务处理
    AtomicInteger类的理解与使用
    java队列——queue详细分析
    ABAP DEMO so批量导入
    ABAP DEMO ole示例程序
  • 原文地址:https://www.cnblogs.com/ldq2016/p/6834643.html
Copyright © 2011-2022 走看看