[转]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方法 如果是如下情况,请考虑使用 ...
随机推荐
- PWA 入门: 写个非常简单的 PWA 页面
Progressive Web Apps 是 Google 提出的用前沿的 Web 技术为网页提供 App 般使用体验的一系列方案. 这篇文章里我们来完成一个非常简单的 PWA 页面. 一个 PWA ...
- [企业化NET]Window Server 2008 R2[3]-SVN 服务端 和 客户端 基本使用
1. 服务器基本安装即问题解决记录 √ 2. SVN环境搭建和客户端使用 2.1 服务端 和 客户端 安装 √ 2.2 项目建立与基本使用 √ 2.3 基本冲突解决, ...
- Oracle 12C -- 统一启动/关闭PDBs
SQL> select name,open_mode from v$pdbs; NAME OPEN_MODE ------------------------------ ---------- ...
- 怎样为你的CSDN博客增加百度统计
曾经CSDN使用的 量子统计 能够非常好的统计我们的博客的訪问数量.地域等等信息,可是不知道后来为什么不在使用了.那么怎样找到 一种替换的方式那? 下边,就给大家介绍一下怎样使用百度统计. 百度统计账 ...
- 【转载并整理】mysql 1293错误 建表两个timestamp
http://www.jb51.net/article/50878.htm 这里要使用到mysql的触发器
- 转 MySQL问题排查工具介绍
原文链接: http://mrchenatu.com/2017/03/24/mysql-tool/ 本总结来自美团内部分享,屏蔽了内部数据与工具 知识准备 索引 索引是存储引擎用于快速找到记录的一种数 ...
- notepad++添加插件管理器
notepad++ 是一个很不错的文本编辑器,添加一些插件可以更好地使用. 首先需要使用插件管理器,最新版本的github地址是:https://github.com/bruderstein/nppp ...
- 关于Server Tomcat v8.0 Server at localhost failed to start的解决办法
测试环境: Eclipse Java EE IDE for Web Developers. Version: Luna Service Release 1 (4.4.1)Build id: 20140 ...
- git从ssh到提交到github
1.安装 Git 客户端 yum install git 2.打开 Git Bash,开始键入用户信息,和github通讯用的,不能乱写: git config --global user.name ...
- 转【Python】同时向控制台和文件输出日志logging
#-*- coding:utf-8 -*-import logging # 配置日志信息logging.basicConfig(level=logging.DEBUG, format='%(ascti ...