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. public class Person
  3. {
  4. public String name;
  5. private Integer age;
  6. private String sex;
  7. //省略所有属性的set、get方法

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

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

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

运行结果:

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

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

运行结果:

    1. -----Class.getDeclaredField(String name)用法-------
    2. VipMao
    3. -----遍历属性值-------
    4. VipMao
    5. 24
    6. ----修改name属性后再遍历属性值------
    7. Maoge
    8. 24

Java反射之Field用法的更多相关文章

  1. Java 反射机制[Field反射]

    Java 反射机制[Field反射] 1.  反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...

  2. java 反射与常用用法

    java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理. 如何获得Class对象 ...

  3. Java反射的常见用法

    反射的常见用法有三类,第一类是“查看”,比如输入某个类的属性方法等信息,第二类是“装载“,比如装载指定的类到内存里,第三类是“调用”,比如通过传入参数,调用指定的方法. 1 查看属性的修饰符.类型和名 ...

  4. Java 反射之Class用法

    下面示范如果通过Class对象获取对应类的信息: package com.reflect; import java.lang.annotation.Annotation; import java.la ...

  5. JAVA反射之 Field (属性)

    主要方法: public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName ...

  6. Java 基础之详解 Java 反射机制

    一.什么是 Java 的反射机制?   反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...

  7. Java 反射机制[Method反射]

    Java 反射机制[Method反射] 接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPerso ...

  8. java反射的认知和学习

    1.学习了Class对象,Filed对象(对应数据),Method对像(对应函数),Constructor对象(对应构造函数). 2.Declared可用于获取私有的数据和方法,但是打印得使用setA ...

  9. java反射-- Field 用法实践

    java 反射是一种常用的技术手段, 通过加载类的字节码的方式来获取相关类的一些信息 比如成员变量, 成员方法等. Field 是什么呢? field 是一个类, 位于java.lang.reflec ...

随机推荐

  1. <原创> 通过PEB获得进程路径 (附完整工程)

    完整工程:http://files.cnblogs.com/files/Gotogoo/%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86%E5%99%A8%28x86%26%2 ...

  2. CodeForces 500E New Year Domino

    题意: 从左到右排列着\(n\)个多米诺骨牌,它们分别站在\(x\)轴上的位置\(p_i\)上且高度为\(l_i\). 当第\(i\)个多米诺骨牌向右倒下时,如果\(p_i < p_j \leq ...

  3. tarjan - SPFA - Luogu 3387【模板】缩点

    [模板]缩点 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...

  4. LINQ 的查询执行何时是延迟执行,何时是立即执行,以及查询的复用

    延迟执行的经典例子: 我们用 select ++i 就可以看到在foreach 时候,查询才被执行. public static void Linq99(){    int[] numbers = n ...

  5. 浅谈我所见的CSS命名风格

    在两年工作中,总结一下我所见的css命名风格. 1.单一class命名 .header { width: 500px; } .item { text-indent: 20%; } 优点:简单,渲染效率 ...

  6. 豆邮windows客户端(第三方)开发详解

    “豆邮”,是社区网站“豆瓣”的一个类似私信的功能模块.在豆瓣官网,“豆邮”曾一度被改为“私信”,但在遭到众多豆瓣用户的强烈反对之后又改了回来.然而,在豆瓣的移动客户端上,仍称呼为“私信”. 豆邮的设定 ...

  7. stl vector 类

    目录 [-]说明构造方法例子vector 类中定义了4中种构造函数: · 默认构造函数,构造一个初始长度为0的空向量,如:vector<int> v1; · 带有单个整形参数的构造函数,此 ...

  8. loadrunner参数化数据分配方法

    数据分配方法: 在“Select next row“列表中选择一个数据分配方法,以指示在Vuser脚本执行期间如何从参数文件中取得数据.选项包括”Sequential“.“Random”.“Uniqu ...

  9. PDO 使用prepared statement 预处理LIMIT等非表字段参数

    由于一些驱动不支持原生的预处理语句,因此PDO可以完全模拟预处理.PDO的模拟预处理是默认打开的,即便MYSQL驱动本身支持预处理,在默认打开的状态下,PDO是不会用到MYSQL本身提供的预处理功能. ...

  10. 【Luogu】P1251餐巾计划(上下界费用流)

    题目链接 学了一下上下界费用流,似乎很nb.但是我说得不好,所以这里给出博客链接. 某dalao的博客 然后这道题的解法就是先用上下界费用流的建图方式连早上和晚上之间的那条边,保证当天一定会有r条或以 ...