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

 

关于获取类的字段有两种方式: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 ()方法的区别

    关于获取类的字段有两种方式:getFields()和getDeclaredFields().我们先来看看这两者的区别吧: getFields():获得某个类的所有的公共(public)的字段,包括父类 ...

  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. 用node.js搭建本地服务器

    我的第一篇笔记来写写node.js,我对node.js的并不是很了解,基本的项目路径变换还是会的.原先我下载node.js就是我想学vue.js,后来因为工作的繁忙搁浅了我的计划.最近在学习phase ...

  2. C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

    这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...

  3. Yii2 Ajax Post 实例及常见错误修正

    先贴下我的代码: signup.js$('.reg_verify_pic').click(function(){ var csrfToken = $('meta[name="_csrf-To ...

  4. Kubernetes 使用私服镜像

    非常感谢这些无私知识分享的同僚 重要参考:http://blog.csdn.net/u013812710/article/details/52766227 1.首先你得有个私库,这里我用的是阿里云私库 ...

  5. .net core 部署到 iis 步骤及报错解决方法

    我写了一个Asp.net core mvc项目,但是部署在iis发生了502.5的问题一直解决不了. 环境 系统:最强Win10; 工具:轻巧VS Code; 各种百度bing都没有我要的解决方案,说 ...

  6. GET与POST请求的区别

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...

  7. mysql打不开表问题解决方案

    做开发时候某一表怎么也打不开,数据也不多,网上查了按下面这篇文章完美解决,但是要记得用root登录mysql: 记一次MySQL中Waiting for table metadata lock的解决方 ...

  8. Hibernate入门这一篇就够了

    前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate框架? Hibernate是一种ORM框架,全 ...

  9. 基于LDA的Topic Model变形

    转载于: 转:基于LDA的Topic Model变形 最近有想用LDA理论的变形来解决问题,调研中.... 基于LDA的Topic Model变形 基于LDA的Topic Model变形最近几年来,随 ...

  10. 获取NVIDIA显卡的温度

    NVIDIA显卡在硬件上有温度传感器,可以感知显卡的运行环境.温度数据的获取,一般是通过调用NVIDIA的SDK的相关函数即可.SDK的下载的网址(https://developer.nvidia.c ...