[转]JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
关于获取类的字段有两种方式:getFields()和getDeclaredFields()。我们先来看看这两者的区别吧:
getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
同样类似的还有getConstructors()和getDeclaredConstructors()、getMethods()和getDeclaredMethods(),这两者分别表示获取某个类的方法、构造函数。
具体编码如下:
我们先创建一个POJO
- public class User {
- private long id;
- private String name;
- public void setId(long id) {
- this.id = id;
- }
- public void setName(String name) {
- this.name = name;
- }
- public long getId() {
- return id;
- }
- public String getName() {
- return name;
- }
- }
再来获取此类中的所有字段
Field[] fields = User.class.getDeclaredFields();
获取字段的名称
String fieldName = field.getName();
获取字段的修饰符
int fieldValue = field.getModifiers();//如:private、static、final等
与某个具体的修饰符进行比较
Modifier.isStatic(fieldValue)//看此修饰符是否为静态(static)
获取字段的声明类型
field.getType();//返回的是一个class
与某个类型进行比较
field.getType() == Timestamp.class
获取指定对象中此字段的值
Object fieldObject= field.get(user);//user可以看做是从数据库中查找出来的对象
如果POJO类中有一个集合类型的字段,我们该如何获取字段中中的值呢?
首先创建一个POJO类
- public class Bean {
- private String[] love;
- public String[] getLove() {
- return love;
- }
- public void setLove(String[] love) {
- this.love = love;
- }
- }
创建一个操作类
- import java.lang.reflect.Method;
- public class Admin {
- public static void main(String[] args) {
- try {
- // 赋值
- Object obj = Bean.class.newInstance();
- Class paramClass = Class.forName("[Ljava.lang.String;");
- String[] param = { "吃", "喝", "玩", "乐" };
- Method method = Bean.class.getMethod("setLove", paramClass);
- method.invoke(obj, (Object) param);
- // 取值
- Bean bean = (Bean) obj;
- for (int i = 0; i < bean.getLove().length; i++) {
- System.out.println(bean.getLove()[i]);
- }
- System.out.println();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
得到的结果为:
吃
喝
玩
乐
关于field还有一种情况我们需要注意,就是当字段修饰符为private时,我们需要加上:
field.setAccessible(true);
判断方法是:if (!field.isAccessible())
更详细的解释请点击
接下来补充一下在Java中使用正则表达式
先创建一个正则表达式对象
Pattern pattern = Pattern.compile("[A-Z][a-z]*");
指定为字符串的正则表达式必须首先被编译为此类的实例
Matcher matcher = pattern.matcher(fieldName);
尝试查找与该模式匹配的输入序列的下一个子序列
boolean isMatcher = matcher.find();
返回由以前匹配操作所匹配的输入子序列
String str = matcher.group();
实现非终端添加和替换步骤,以'_'连接各个字段
matcher.appendReplacement(sb, str + "_");
[转]JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别的更多相关文章
- JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别 关于获取类的字段有两种方式:getFields()和getDeclaredFields().我们先来 ...
- Java Thread中,run方法和start方法的区别
两种方法的区别: 1.start方法 用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦 ...
- java.util.Scanner中hasNext()方法和next()方法的区别
先说结论: 两者均根据空格划分数据 两者在没有数据输入时均会等待输入 next()方法会将空格划分的数据依次输出,运行一次,输出一个 hasNext()方法会跟着next()方法移动,当前数据不为空, ...
- Java中Scanner中nextLine()方法和next()方法的区别
https://blog.csdn.net/hello_word2/article/details/54895106
- java数组、java.lang.String、java.util.Arrays、java.lang.Object的toString()方法和equals()方法详解
public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...
- Exception 的 toString() 方法和 getMessage() 方法的区别
Exception 的 toString() 方法和 getMessage() 方法的区别: 在开发的过程中打印错误日志时尽量使用e.toString() 方法, 因为当错误为空指针时 e.getMe ...
- flush方法和close方法的区别
package com.yhqtv.demo05.Writer; import java.io.FileWriter; /* * @author XMKJ yhqtv.com Email:yhqtv@ ...
- flush方法和close方法的区别和字符输出流写数据的其他方法和字符输出流的续写和换行
flush方法和close方法的区别 flush:刷新缓冲区,流对象可以继续使用 close:先刷新缓冲区,然后通知系统释放资源.刘对象不可以再被使用了. public class demo02 { ...
- ThinkPHP的D方法和M方法的区别
M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...
随机推荐
- 在Linux上yum安装运行Redis,只能安装2.4.10(主从)
Installing Redis on CentOS 6.4 First, install the epel repo sudo rpm -Uvh http://download.fedoraproj ...
- oracle下导出某用户所有表的方法
oracle下导出某用户所有表的方法 scott/tiger是用户名和密码,handson是导出的实例名 按用户方式导出数据(owner当中写的是用户名) exp scott/tiger@handso ...
- LINUX-iostat命令讲解
语法如下:iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]-c为汇报CPU的使用情况:- ...
- CStatic的透明背景方法
原文链接: http://blog.sina.com.cn/s/blog_4a470fcc01000406.html 这篇文章中有些许错误,不过思路值得借鉴 如果在一个有颜色的窗体中创建一个CSt ...
- 关于埃博拉病毒的基本知识(ABC)
科学研究表明.埃博拉病毒的存在历史很久远,可能有两千多万年的历史,在类人猿出现的时期就已存在. 埃博拉病毒呈现一种"蚕丝状",又细又长,无色透明.直径有80纳米,长短不等,在14微 ...
- jsp学习小记
- html select与option标签
1.select 元素 select 元素可创建单选或多选菜单.<select> 元素中的 <option> 标签用于定义列表中的可用选项 常用属性如下: autofocus: ...
- 携程的配置中心(阿波罗apollo)
https://github.com/ctripcorp/apollo https://pan.baidu.com/s/1dFEGMIX#list/path=%2Fmeetup%20ppt%2F040 ...
- 查询系统负载信息 Linux 命令详解
linux uptime命令主要用于获取主机运行时间和查询linux系统负载等信息.uptime命令过去只显示系统运行多久.现在,可以显示系统已经运行了多长 时间,信息显示依次为:现在时间.系统已经运 ...
- PHP读取超大日志文件
打开一个17G的日志文件,都不吃力,除了占cpu之外,内存占用不多,如果直接fopen根本打不开 注:它是逐行读取的 foreach( glob( ngx_log. "/*.log" ...