首先不要怪我写的简陋,我提供的更多是一种思路,而不是直接可以使用的工具,毕竟不是大牛。
先来看一个例子:
这是一个普通的DO,是从数据库里取出来的数据
import java.util.Date;
public class UserDO {
private Long userId;
private Date createTime;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
需要将其转换为页面显示的形式,其中日期希望直接是String型的:
public class UserVo {
private Long userId;
private String createTime;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
}
由于数据类型有变更,直接用BeanUtil肯定是不行的,但我希望使用通用的一个方法来实现,而不需要特意写一个UserConvertor.java的类来进行转换,通用实现的接口如下:
UserVo userVo = ConvertorUtil.convertor(userDO, UserVo.class);
*************************************************
以下是我的实现思路
首先想到的是通过Annotation,于是我定义了一个Annotation,如下:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Convertor {
Class<? extends AbstractConvertor> method() default CommonConvertor.class;
String srcField() default "";
String pattern() default "yyyy-MM-dd HH:mm:ss";
}
public class ConvertorParam {
private Object value;
private String pattern;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public String getPattern() {
return pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
}
public interface AbstractConvertor {
public Object transferable(ConvertorParam value);
}
public class CommonConvertor implements AbstractConvertor {
@Override
public Object transferable(ConvertorParam value) {
return value.getValue();
}
}
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateToStringConvertor implements AbstractConvertor {
@Override
public String transferable(ConvertorParam value) {
SimpleDateFormat sdf = new SimpleDateFormat(value.getPattern());
if (value.getValue() == null) {
return null;
}
return sdf.format((Date) value.getValue());
}
}
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;
public class ConvertorUtil {
public static <T> T convertor(Object object, Class<T> clazz) throws Exception {
T result = clazz.newInstance();
List<String> excludeFields = new ArrayList<String>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(Convertor.class)) {
excludeFields.add(field.getName());
Convertor convertor = field.getAnnotation(Convertor.class);
ConvertorParam param = new ConvertorParam();
param.setPattern(convertor.pattern());
String srcFieldName = convertor.srcField();
if (StringUtils.isEmpty(srcFieldName)) {
srcFieldName = field.getName();
}
try {
Object value = null;
Field srcField = object.getClass().getDeclaredField(srcFieldName);
if (srcField == null) {
continue;
} else if (!srcField.isAccessible()) {
srcField.setAccessible(true);
value = srcField.get(object);
srcField.setAccessible(false);
} else {
value = srcField.get(object);
}
param.setValue(value);
} catch (Exception e) {
// no src field exist.
continue;
}
AbstractConvertor abstractConvertor = convertor.method().newInstance();
Object realObject = abstractConvertor.transferable(param);
BeanUtils.setProperty(result, field.getName(), realObject);
}
}
org.springframework.beans.BeanUtils.copyProperties(object, result, excludeFields.toArray(new String[excludeFields.size()]));
return result;
}
}
代码说明:
Convertor:
1.method:定义了使用哪个解析方法来解析来源字段的值
2.srcField:定义了取来源对象的哪个字段的字段名称
3.pattern:为日期类型指定格式化格式
AbstractConvertor:转换器的接口方法,所有转化器都需继承并实现它
ConvertorParam:封装了Convertor中定义好的类型和来源字段的值,做为转换器的参数
CommonConvertor:一个普通的转换器,只是把原值直接赋予给新的对象
DateToStringConvertor:日期转为String的转换器
ConvertorUtil:实现转换的方法
以下是测试结果:
首先修改UserVo,添加了Convertor注解
public class UserVo {
private Long userId;
@Convertor(method = DateToStringConvertor.class, pattern = "yyyy-MM-dd")
private String createTime;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "UserVo [userId=" + userId + ", createTime=" + createTime + "]";
}
}
测试方法:
import java.util.Date;
import org.junit.Test;
public class ConvertorUtilTest {
@Test
public void testConvertor() {
UserDO userDO = new UserDO();
userDO.setUserId(1111L);
userDO.setCreateTime(new Date());
try {
UserVo userVo = ConvertorUtil.convertor(userDO, UserVo.class);
System.out.println(userVo);
} catch (Exception e) {
e.printStackTrace();
}
}
}
得到结果:
UserVo [userId=1111, createTime=2016-07-18]
编后言:
时间有限,先把它记下来,以后有时间再完善。
按照我的想法,可以再引入
1.根据Spring的Bean进行转换
2.根据枚举类进行转换
3.引入组别的概念控制哪些字段需要转换哪些不需要转换
最终实现任何类都可以通过这个方法直接转换,
分享到:
相关推荐
在“JSP&javaBean写的简单用户验证”这个示例中,我们将探讨如何利用这两者实现用户登录验证的功能。** **JSP** 是一种基于Java的服务器端脚本语言,它允许开发者在HTML页面中嵌入Java代码,以实现动态内容的生成。...
JavaBean是一种在Java编程语言中实现的软件组件,主要用于构建可重用的代码模块,尤其在Web应用程序中...通过这个项目,学习者不仅可以掌握JavaBean的基本概念,还能了解到Web开发中的请求处理和数据持久化等核心概念。
JavaBean是一种特殊的Java类,它是Java编程语言中的一个核心概念,尤其在开发企业级应用程序时极为常见。JavaBean遵循特定的规范,使它们能够被其他Java应用或开发工具(如IDEs)识别、可视化和操作。JavaBean的主要...
标题 "自己写的一个购物车(jsp+javabean)" 提供了一个关于小型电子商务系统实现的基础信息,这是一个基于JavaWeb技术的简单购物车应用。在这个项目中,开发者使用了JSP(JavaServer Pages)和JavaBean两种核心组件来...
JavaBean是一种在Java编程...总之,JavaBean的动态方法调用是Java语言中一个强大的工具,它基于反射机制,能让我们在运行时更加灵活地操作对象。理解并熟练运用这一特性,对于提升Java开发的灵活性和效率有着重要作用。
4. **属性访问器和修改器**:除了基本的getter和setter,JavaBean还可能包含is方法(对于布尔属性)和accessor方法(用于读取不可变属性)。 5. **标准命名**:属性、方法和事件的命名应遵循一定的标准,以确保与...
【标题】:“jsp + javaBean +Dao 写的博客程序” 这个标题揭示了一个基于Web的博客应用程序,它采用经典的Java Web开发技术栈:JSP(JavaServer Pages)、JavaBean和DAO(Data Access Object)模式。这是一个典型...
在IT行业中,Servlet和JavaBean是Java Web开发中的核心组件,尤其在构建动态网页和企业级应用程序时不可或缺。Servlet是一种Java编程语言的接口,用于扩展服务器的功能,而JavaBean则是一种符合特定规范的Java类,...
最近在研究Webservice的时候遇到一个问题,把java对象转化问json后传过去,接受的是String类型,怎么恢复到原来的java对象呢,后来再一个项目中看到了转换方法,转换顺序为javaBean--jsonObject--jsonString,还原...
为了确保这个JavaBean能运行,可能还有一个简单的测试类`shiyan2`,用于创建JavaBean对象并调用`findPosition()`方法: ```java public class Test { public static void main(String[] args) { StringSearchBean...
在本实验中,`information`类就是个简单的JavaBean,它包含`username`和`password`两个属性,以及对应的getter和setter方法。 - JavaBean需是公开的类,且有一个无参数的构造器,以便于在运行时实例化。 - 属性的...
在JavaBean中,通常有公有的属性(getter和setter方法)来存储和访问数据,以及可能包含一些业务逻辑的方法。JavaBean遵循的规则如下: 1. 类必须是公共的(`public`)。 2. 类必须有一个无参数的构造函数,通常是...
【JavaBean 简介】 JavaBean 是 Java 编程语言中的一种特殊类,它遵循特定的编程规范,主要用于封装数据和实现业务逻辑。在MVC(Model-View-Controller)设计模式中,JavaBean 作为 Model 层,是应用程序的数据载体...
* 可视化的 bean 必须继承的类是 java.awt.Component,这样它们才能添加到可视化容器中去,非可视化 bean 则不需要继承这个类。 * JavaBean 可以看成是一个黑盒子,即只需要知道其功能而不必管其内部结构的软件设备...
总的来说,这个项目"JavaBean_Javabean增删改查_audiencevu9_"涉及到Web开发的基础知识,包括JavaBean的设计和使用、Servlet的生命周期和请求处理、JSP的页面指令和表达式语言、以及数据库操作。通过实践这些,...
下面我们将详细探讨如何实现JavaBean到XML以及XML到JavaBean的转换,并介绍一个用于此目的的工具类和相关的jar包。 首先,JavaBean是一种符合特定规范的Java类,它通常具有公共的getter和setter方法,用于封装属性...
在这个"Test多表联合增删改查,struts两个JAVABEAN.rar"压缩包中,我们可以推测其包含的内容是关于使用Struts进行多表联合操作的示例,以及两个相关的JavaBean类。 首先,多表联合查询在数据库操作中很常见,特别是...
MD5(Message-Digest Algorithm 5)是一种广泛用于数据安全的哈希函数,它能够将任意长度的数据转化为固定长度的128位(通常用32位的十六进制数表示)摘要信息。在IT行业中,MD5常用于数据校验、密码存储等方面,...
本文将深入探讨XML与JavaBean之间的转换、XML标签的大小写规则、XML特殊符号的处理以及CDATA的生成。 1. XML转JavaBean: 在Java编程中,XML数据经常需要转换为Java对象以便于操作。这一过程通常通过XML解析器来...
在Java开发中,JavaBean是一种遵循特定规范的Java类,通常用于封装数据并提供相应的getter和setter方法。在数据库操作中,将SQL查询结果映射到Java对象是常见的需求,这时JavaBean的作用就显现出来了。...