Java反射通过Getter方法获取对象VO的属性值过程解析
作者:Nick Huang 发布时间:2023-04-11 06:11:33
标签:Java,反射,Getter,VO,属性值
这篇文章主要介绍了Java反射通过Getter方法获取对象VO的属性值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
有时候,需要动态获取对象的属性值。
比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定。比如,这次User,下次可能是Company。
e.g. 这次我需要做一个Excel导出的工具类,导出的批量数据是以List类型传入的,List里的对象自然每次都不同,这取决于需要导出什么信息。
为了使用方便,将对象的属性名与属性值存于Map当中,使用时就可以直接遍历Map了。
此次的思路是通过反射和Getter方法取得值,然后记录在一个Map当中。
Kick start...
将对象的属性名与属性值存于Map当中,以key,value的形式存在,而value并不希望以单一类型(如String)存在(因为涉及多种类型),所以用一个FieldEntity的自定义类(此类包含属性名,属性值,属性值类型 等属性)
FieldEntity
package com.nicchagil.util.fields;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class FieldsCollector {
public static Map<String, FieldEntity> getFileds(Object object)
throws SecurityException, IllegalArgumentException, NoSuchMethodException,
IllegalAccessException, InvocationTargetException {
Class clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
Map<String, FieldEntity> map = new HashMap<String, FieldEntity> ();
for (int i = 0; i < fields.length; i++) {
Object resultObject = invokeMethod(object, fields[i].getName(), null);
map.put(fields[i].getName(), new FieldEntity(fields[i].getName(), resultObject, fields[i].getType()));
}
return map;
}
public static Object invokeMethod(Object owner, String fieldname,
Object[] args) throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Class ownerClass = owner.getClass();
Method method = null;
method = ownerClass.getMethod(GetterUtil.toGetter(fieldname));
Object object = null;
object = method.invoke(owner);
return object;
}
}
主类,通过这个类的静态方法获取结果Map
FieldsCollector
package com.nicchagil.util.fields;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class FieldsCollector {
public static Map<String, FieldEntity> getFileds(Object object)
throws SecurityException, IllegalArgumentException, NoSuchMethodException,
IllegalAccessException, InvocationTargetException {
Class clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
Map<String, FieldEntity> map = new HashMap<String, FieldEntity> ();
for (int i = 0; i < fields.length; i++) {
Object resultObject = invokeMethod(object, fields[i].getName(), null);
map.put(fields[i].getName(), new FieldEntity(fields[i].getName(), resultObject, fields[i].getType()));
}
return map;
}
public static Object invokeMethod(Object owner, String fieldname,
Object[] args) throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Class ownerClass = owner.getClass();
Method method = null;
method = ownerClass.getMethod(GetterUtil.toGetter(fieldname));
Object object = null;
object = method.invoke(owner);
return object;
}
}
为了代码清楚些,将一些工具方法独立一下,如field name到getter name的转换方法
GetterUtil
package com.nicchagil.util.fields;
public class GetterUtil {
/**
* Get getter method name by field name
* @param fieldname
* @return
*/
public static String toGetter(String fieldname) {
if (fieldname == null || fieldname.length() == 0) {
return null;
}
/* If the second char is upper, make 'get' + field name as getter name. For example, eBlog -> geteBlog */
if (fieldname.length() > 2) {
String second = fieldname.substring(1, 2);
if (second.equals(second.toUpperCase())) {
return new StringBuffer("get").append(fieldname).toString();
}
}
/* Common situation */
fieldname = new StringBuffer("get").append(fieldname.substring(0, 1).toUpperCase())
.append(fieldname.substring(1)).toString();
return fieldname;
}
}
大功告成!!!
现在,写个VO作为模拟数据
User
import java.util.Date;
public class User {
private String username;
private String password;
private String eBlog;
private Date registrationDate;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String geteBlog() {
return eBlog;
}
public void seteBlog(String eBlog) {
this.eBlog = eBlog;
}
public Date getRegistrationDate() {
return registrationDate;
}
public void setRegistrationDate(Date registrationDate) {
this.registrationDate = registrationDate;
}
}
最后,测试类,此类将直接调用FieldsCollector~~
Call
import java.util.Date;
import java.util.Map;
import com.nicchagil.util.fields.FieldEntity;
import com.nicchagil.util.fields.FieldsCollector;
public class Call {
public static void main(String[] args) throws Exception {
User user = new User();
user.setUsername("user109");
user.setPassword("pwd109");
user.seteBlog("http://www.cnblogs.com/nick-huang/");
user.setRegistrationDate(new Date());
Map<String, FieldEntity> map = FieldsCollector.getFileds(user);
System.out.println(map);
}
}
Oh year, 成功了~~~
来源:https://www.cnblogs.com/nick-huang/p/3831849.html


猜你喜欢
- 简述最近做的公司项目,图片比较多,不想给其存储到自己服务器上,就买了阿里云的OSS服务器来哦进行存储,其实集成第三方平台,一般没什么难度,当
- xml中: <ImageView &nb
- 在项目中经常会遇到对按钮、自定义控件的 Item 等防止多次重复的点击的问题,下面做一个小结。方法1:使用 RxJava 的 throttl
- 这两天遇到一个服务假死的问题,具体现象就是服务不再接收任何请求,客户端会抛出Broken Pipe。检查系统状态执行top,发现CPU和内存
- 目录概述代码实现完整代码概述在PC端用.NET开发一个蓝牙下载的程序。实现在PC上查找周围的蓝牙设备(主要是手机),并将PC上的文件通过蓝牙
- 一般的接口实现多态定义接口 interface Ipeople { void say(); }定义实现的类 public cla
- 一、Java类的加载顺序引用1个网上的经典例子,并做稍许改动,以便大家更好地理解。public class Animal {
- 本文实例讲述了Android TextView实现带链接文字事件监听的三种常用方式。分享给大家供大家参考,具体如下:/** * TextVi
- 经过一番的探索,终于搞清楚关键字async/await 在.net4.5之后可用的巧妙之处,在这里记录一下也与大家分享一下个人的心得体会as
- 1、通过C#调用Java的方法:在C#中添加调用的一些代码,利用Unity提供的一些接口实现调用Java!private const str
- 本文实例讲述了Android开发使用Handler的PostDelayed方法实现图片轮播功能。分享给大家供大家参考,具体如下:第一步:创建
- 今天发布本文的原因是应一个网友要求,就是实现局部的图片滑动指引效果。这种效果一般是在新闻客户端上比较常见,其功能是:1、顶部单张图片左右拖拉
- 按照常规思维,往一个map里put一个已经存在的key,会把原有的key对应的value值覆盖,然而通过一次线上问题,发现Java8中的Co
- 单例模式的介绍说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保
- socketpair()函数的声明:#include <sys/types.h>#include <sys/socket.
- 上转型对象:子类创建对象 并将这个对象引用赋值给父类的对象。语法格式:Father f=new Son();注意事项:上转型对象是由子类创建
- 什么是线程线程被称为轻量级进程,是程序执行的最小单位,它是指在程序执行过程中,能够执行代码的一个执行单位。每个程序程序都至少有一个线程,也即
- 本文是Java IO总结系列篇的第4篇,前篇的访问地址如下:总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇总结java从
- 苹果的Touch Icon相对我们都比较熟悉,是苹果为了支持网络应用(或者说网页)添加到桌面需要的图标,有了这些Touch Icon的网页链
- 前篇回顾:Spring源码解析容器初始化构造方法在上一篇文章中,我们介绍完了AnnotationConfigApplicationConte