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
- package com.mao.test;
- public class Person
- {
- public String name;
- private Integer age;
- private String sex;
- //省略所有属性的set、get方法
下面开始通过Field反射的各方法访问属性
- package com.mao.test;
- import java.lang.reflect.Field;
- public class Test
- {
- public static void main(String[]args) throws NoSuchFieldException, SecurityException
- {
- Person person =new Person();
- //通过Class.getDeclaredField(String name)获取类或接口的指定已声明字段。
- Field f1=person.getClass().getDeclaredField("name");
- System.out.println("-----Class.getDeclaredField(String name)用法-------");
- System.out.println(f1);
- System.out.println("-----Class.getDeclaredFields()用法-------");
- //通过Class.getDeclaredFields()获取类或接口的指定已声明字段。
- Field []f2=person.getClass().getDeclaredFields();
- for(Field field:f2)
- {
- System.out.println(field);
- }
- System.out.println("-----Class.getField(String name)用法-------");
- //通过Class.getField(String name)返回一个类或接口的指定公共成员字段,私有成员报错。
- Field f3=person.getClass().getField("name");
- System.out.println(f3);
- //如果获取age属性(私有成员) 则会报错
- //Field f3=person.getClass().getField("name");
- System.out.println("-----Class.getFields()用法-------");
- //通过Class.getField(),返回 Class 对象所表示的类或接口的所有可访问公共字段。
- Field []f4=person.getClass().getFields();
- for(Field fields:f4)
- {
- //因为只有name属性为共有,因此只能遍历出name属性
- System.out.println(fields);
- }
- }
- }
通过上面程序也可以发现Class.getField(String
name)和Class.getFields()都只能返回公有属性,如果访问私有属性就会报错java.lang.NoSuchFieldException。
运行结果:
- -----Class.getDeclaredField(String name)用法-------
- public java.lang.String com.mao.test.Person.name
- -----Class.getDeclaredFields()用法-------
- public java.lang.String com.mao.test.Person.name
- private java.lang.Integer com.mao.test.Person.age
- private java.lang.String com.mao.test.Person.sex
- -----Class.getField(String name)用法-------
- public java.lang.String com.mao.test.Person.name
- -----Class.getFields()用法-------
- public java.lang.String com.mao.test.Person.name
二:获取属性的属性值并修改属性值
获取属性的值用get(Object obj)的方法,但是获取私有属性的时候必须先设置Accessible为true,然后才能获取。
下面咱们获取Person各属性的属性值并将姓名属性值修改
Test.java
- package com.mao.test;
- import java.lang.reflect.Field;
- public class Test
- {
- public static void main(String[]args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
- {
- Person person =new Person();
- person.setName("VipMao");
- person.setAge(24);
- person.setSex("男");
- //通过Class.getDeclaredField(String name)获取类或接口的指定属性值。
- Field f1=person.getClass().getDeclaredField("name");
- System.out.println("-----Class.getDeclaredField(String name)用法-------");
- System.out.println(f1.get(person));
- System.out.println("-----Class.getDeclaredFields()用法-------");
- //通过Class.getDeclaredFields()获取类或接口的指定属性值。
- Field []f2=person.getClass().getDeclaredFields();
- for(Field field:f2)
- {
- field.setAccessible(true);
- System.out.println(field.get(person));
- }
- //修改属性值
- System.out.println("----修改name属性------");
- f1.set(person, "Maoge");
- //修改后再遍历各属性的值
- Field []f3=person.getClass().getDeclaredFields();
- for(Field fields:f3)
- {
- fields.setAccessible(true);
- System.out.println(fields.get(person));
- }
- }
- }
从上面程序我们得知,通过get(Object obj)获取属性的值,通过set(Object obj,value)重新设置新的属性值,并且当我们需要获取私有属性的属性值得时候,我们必须设置Accessible为true,然后才能获取。
运行结果:
- -----Class.getDeclaredField(String name)用法-------
- VipMao
- -----遍历属性值-------
- VipMao
- 24
- 男
- ----修改name属性后再遍历属性值------
- Maoge
- 24
- 男
Java反射之Field用法的更多相关文章
- Java 反射机制[Field反射]
Java 反射机制[Field反射] 1. 反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...
- java 反射与常用用法
java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理. 如何获得Class对象 ...
- Java反射的常见用法
反射的常见用法有三类,第一类是“查看”,比如输入某个类的属性方法等信息,第二类是“装载“,比如装载指定的类到内存里,第三类是“调用”,比如通过传入参数,调用指定的方法. 1 查看属性的修饰符.类型和名 ...
- Java 反射之Class用法
下面示范如果通过Class对象获取对应类的信息: package com.reflect; import java.lang.annotation.Annotation; import java.la ...
- JAVA反射之 Field (属性)
主要方法: public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName ...
- Java 基础之详解 Java 反射机制
一.什么是 Java 的反射机制? 反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
- Java 反射机制[Method反射]
Java 反射机制[Method反射] 接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPerso ...
- java反射的认知和学习
1.学习了Class对象,Filed对象(对应数据),Method对像(对应函数),Constructor对象(对应构造函数). 2.Declared可用于获取私有的数据和方法,但是打印得使用setA ...
- java反射-- Field 用法实践
java 反射是一种常用的技术手段, 通过加载类的字节码的方式来获取相关类的一些信息 比如成员变量, 成员方法等. Field 是什么呢? field 是一个类, 位于java.lang.reflec ...
随机推荐
- 使用fio测试磁盘I/O性能
简介: fio是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, nu ...
- 哪里是Maven的中央存储库?
当你建立了一个Maven工程,Maven会检查你的pom.xml文件,确定要下载的依赖.首先,Maven将从您的本地库Maven查找,如果没有找到,Maven会从中央存储库-http://repo1. ...
- rocketmq源码分析4-事务消息实现原理
为什么消息要具备事务能力 参见还是比较清晰的.简单的说 就是在你业务逻辑过程中,需要发送一条消息给订阅消息的人,但是期望是 此逻辑过程完全成功完成之后才能使订阅者收到消息.业务逻辑过程 假设是这样的: ...
- Andorid 生成NDK动态链接库 .so库
.so库第一次见到是在搜索Android保存静态秘钥等特殊id字段做法时看到的-通过NDK的方式将静态秘钥保存在so文件中, 关于原生开发工具包(NDK)详细见官网指南要更详细,这里我记录我度娘各种结 ...
- Zookeeper在windows环境下安装
1.已安装JDK并配置好了环境变量 2.下载Zookeeper,在清华大学镜像下载,选择合适版本 https://mirrors.tuna.tsinghua.edu.cn/apache/zookee ...
- JAVA-STRUTS-2x的项目配置
首先是web.xml的配置,这个是项目加载的开始. <display-name></display-name> <!--struts2配置开始--> <fil ...
- 51nod 1010 只包含因子2 3 5的数 二分答案
1010 只包含因子2 3 5的数 K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 > ...
- Good Bye 2017
太菜了啊,一不小心就goodbye rating了 A. New Year and Counting Cards time limit per test 1 second memory limit p ...
- Java分页内容实例详解
首先定义一个fruit表,表里含有很多数据: 定义一个数据文件: public class Fruit { public String getIds() { return ids; } public ...
- [Err] 1022 - Can't write; duplicate key in table '#sql-1500_26'
今天用powerdesigner修改了一些外键关系,有两个外键的名字取一样的,忘记改了.然后在用navicat运行sql文件时,报出[Err] 1022 - Can't write; dupl ...