关于获取类的字段有两种方式:getFields()和getDeclaredFields()。我们先来看看这两者的区别吧:

getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。 
getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。

同样类似的还有getConstructors()和getDeclaredConstructors()、getMethods()和getDeclaredMethods(),这两者分别表示获取某个类的方法、构造函数。

具体编码如下:

我们先创建一个POJO

  1. public class User {
  2. private long id;
  3. private String name;
  4. public void setId(long id) {
  5. this.id = id;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public long getId() {
  11. return id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. }

再来获取此类中的所有字段
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类

  1. public class Bean {
  2. private String[] love;
  3. public String[] getLove() {
  4. return love;
  5. }
  6. public void setLove(String[] love) {
  7. this.love = love;
  8. }
  9. }

创建一个操作类

  1. import java.lang.reflect.Method;
  2. public class Admin {
  3. public static void main(String[] args) {
  4. try {
  5. // 赋值
  6. Object obj = Bean.class.newInstance();
  7. Class paramClass = Class.forName("[Ljava.lang.String;");
  8. String[] param = { "吃", "喝", "玩", "乐" };
  9. Method method = Bean.class.getMethod("setLove", paramClass);
  10. method.invoke(obj, (Object) param);
  11. // 取值
  12. Bean bean = (Bean) obj;
  13. for (int i = 0; i < bean.getLove().length; i++) {
  14. System.out.println(bean.getLove()[i]);
  15. }
  16. System.out.println();
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }

得到的结果为:




关于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 + "_");

原文地址:http://blog.csdn.net/zlb824/article/details/7494300

[转]JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别的更多相关文章

  1. JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别

    JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别   关于获取类的字段有两种方式:getFields()和getDeclaredFields().我们先来 ...

  2. Java Thread中,run方法和start方法的区别

     两种方法的区别: 1.start方法 用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦 ...

  3. java.util.Scanner中hasNext()方法和next()方法的区别

    先说结论: 两者均根据空格划分数据 两者在没有数据输入时均会等待输入 next()方法会将空格划分的数据依次输出,运行一次,输出一个 hasNext()方法会跟着next()方法移动,当前数据不为空, ...

  4. Java中Scanner中nextLine()方法和next()方法的区别

    https://blog.csdn.net/hello_word2/article/details/54895106

  5. 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 ...

  6. Exception 的 toString() 方法和 getMessage() 方法的区别

    Exception 的 toString() 方法和 getMessage() 方法的区别: 在开发的过程中打印错误日志时尽量使用e.toString() 方法, 因为当错误为空指针时 e.getMe ...

  7. flush方法和close方法的区别

    package com.yhqtv.demo05.Writer; import java.io.FileWriter; /* * @author XMKJ yhqtv.com Email:yhqtv@ ...

  8. flush方法和close方法的区别和字符输出流写数据的其他方法和字符输出流的续写和换行

    flush方法和close方法的区别 flush:刷新缓冲区,流对象可以继续使用 close:先刷新缓冲区,然后通知系统释放资源.刘对象不可以再被使用了. public class demo02 { ...

  9. ThinkPHP的D方法和M方法的区别

    M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...

随机推荐

  1. IntelliJ IDEA 缺少 javax 包 支持

    在初次使用 IntelliJ IDEA 中,当你使用javax.servlet包下的类时(例:javax.servlet.http.HttpServlet), 在你会发现在IntelliJ IDEA里 ...

  2. OpenCV 学习笔记03 直线和圆检测

    检测边缘和轮廓不仅重要,还经常用到,它们也是构成其他复杂操作的基础. 直线和形状检测与边缘和轮廓检测有密切的关系. 霍夫hough 变换是直线和形状检测背后的理论基础.霍夫变化是基于极坐标和向量开展的 ...

  3. 来设置IE兼容模式

    来设置IE兼容模式 文件兼容性用于定义让IE如何编译你的网页.此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式. 前言 为了帮助确保你的网页在所有未来的IE版本 ...

  4. 向量运算 与 JavaScript

    二维向量都包含两个值:方向(direction)及大小(magnitude)   这两个值可以表达出各种各样的物理特性来,比如力和运动.如两个物体间的碰撞检测.   向量的大小   虽说二维向量是对大 ...

  5. VB将MSHFlexGrid数据导出到Excel文件通用功能

    1.通用导出Excel功能. 2.将 MSHFlexGrid数据导出到Excel文件通用功能. 3.具体代码如下: '将下列代码保存到一模块文件中,调用方法:Export fgrid1,cd1 Pub ...

  6. 在java项目中使用 Lombok 及可能问题

    一.Maven项目使用步骤一般包含两步,1)引入依赖 2)特定的 IDE 引入对应的插件 1)在POM中引入依赖 <!-- https://mvnrepository.com/artifact/ ...

  7. mybatis 框架动态传入参数${}和#{}之间的区别

    动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理.下面让我们先来熟悉下myb ...

  8. tuple与list

    tuple是一个引用之后就不可以修改的类型,是一个immutable类型 list是一个mutable的类型,引用之后是可以修改的.同时可以通过索引来修改list中各个元素.这一点是tuple做不到的 ...

  9. ReactNative WebView组件详解

    在开发Android的时候,一般我们会有一些加载网页的需求,或者执行一些JavaScript,我们都知道在Android中实现这个功能的控件是WebView,在ReactNative中也有实现此类需求 ...

  10. 持续集成(1)gitlab的安装

    操作系统:centos 6.5 关闭selinux # 修改/etc/selinux/config 文件 将SELINUX=enforcing改为SELINUX=disabled ,然后重启电脑 # ...