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 ...
随机推荐
- python for data analysis chapter1~2
Q1:numpy与series的区别:index Tab补全(任意路径Tab) 内省(函数:?显示文档字符串,??显示源代码:结合通配符:np.* load *?) %load .py ctrl-c( ...
- Django 二——models(admin、ORM),一对一、一对多、多对多操作,all、values、value_list的对比
内容概要 1.关系对象映射ORM 2.admin的配置(选修) 3.all().values().value_list()的对比 4.数据库操作(一对一.一对多.多对多) 5.HttpResponse ...
- Dijkstra算法_北京地铁换乘_android实现-附带源码.apk
Dijkstra算法_北京地铁换乘_android实现 android 2.2+ 源码下载 apk下载 直接上图片 如下: Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计 ...
- Leetcode 462.最少移动次数使数组元素相等
最少移动次数使数组元素相等 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输入: [1,2, ...
- [python学习篇][廖雪峰][1]高级特性 ---迭代
由于字符串也是可迭代对象,因此,也可以作用于for循环: >>> for ch in 'ABC': ... print ch ... A B C 所以,当我们使用for循环时,只要作 ...
- Farey sequences
n阶的法里数列是0和1之间最简分数的数列,由小至大排列,每个分数的分母不大于n. Stern-Brocot树(SB Tree)可以生成这个序列 {0/1,1/1} {0/1,1/2,1/1} {0/1 ...
- Oracle 用户和权限
Oracle 用户和权限Oracle 中,一般不会轻易在一个服务器上创建多个数据库,在一个数据库中,不同的项目由不同的用户访问,每一个用户拥有自身创建的数据库对象,因此用户的概念在 Oracle中非常 ...
- JDBC 学习笔记(五)—— Statement
JDBC 使用 Statement 作为 SQL 语句的执行器. Statement 通过 Connection.createStatement() 方法创建,一共支持以下6种方式执行 SQL 语句: ...
- ubuntu14.04 python + opencv 傻瓜式安装解决方案
ubuntu14.04 python + opencv 傻瓜式安装解决方案 ubuntu下使python和opencv来做开发的话,总要花那么点时间来配置环境.我偶然间发现了一种傻瓜式安装办法希望快 ...
- python语言基础问题汇总
问题汇总 问题分类 怎么在一个python脚本里调用另一个python脚本 把两个脚本filea.py 和 fileb.py 放在同一个目录下,然后在filea.py的开头写: import file ...