`
gegewuqin9
  • 浏览: 28889 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于javabean的转化,写了个公用的方法,抛个砖看看能否引到玉

阅读更多
首先不要怪我写的简陋,我提供的更多是一种思路,而不是直接可以使用的工具,毕竟不是大牛。
先来看一个例子:
这是一个普通的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.引入组别的概念控制哪些字段需要转换哪些不需要转换
最终实现任何类都可以通过这个方法直接转换,
0
1
分享到:
评论

相关推荐

    JSP&javaBean写的简单用户验证

    在“JSP&javaBean写的简单用户验证”这个示例中,我们将探讨如何利用这两者实现用户登录验证的功能。** **JSP** 是一种基于Java的服务器端脚本语言,它允许开发者在HTML页面中嵌入Java代码,以实现动态内容的生成。...

    用javabean写的投票系统

    JavaBean是一种在Java编程语言中实现的软件组件,主要用于构建可重用的代码模块,尤其在Web应用程序中...通过这个项目,学习者不仅可以掌握JavaBean的基本概念,还能了解到Web开发中的请求处理和数据持久化等核心概念。

    JAVABEAN

    JavaBean是一种特殊的Java类,它是Java编程语言中的一个核心概念,尤其在开发企业级应用程序时极为常见。JavaBean遵循特定的规范,使它们能够被其他Java应用或开发工具(如IDEs)识别、可视化和操作。JavaBean的主要...

    自己写的一个购物车(jsp+javabean)

    标题 "自己写的一个购物车(jsp+javabean)" 提供了一个关于小型电子商务系统实现的基础信息,这是一个基于JavaWeb技术的简单购物车应用。在这个项目中,开发者使用了JSP(JavaServer Pages)和JavaBean两种核心组件来...

    JavaBean 方法的动态调用

    JavaBean是一种在Java编程...总之,JavaBean的动态方法调用是Java语言中一个强大的工具,它基于反射机制,能让我们在运行时更加灵活地操作对象。理解并熟练运用这一特性,对于提升Java开发的灵活性和效率有着重要作用。

    JavaBean示例

    4. **属性访问器和修改器**:除了基本的getter和setter,JavaBean还可能包含is方法(对于布尔属性)和accessor方法(用于读取不可变属性)。 5. **标准命名**:属性、方法和事件的命名应遵循一定的标准,以确保与...

    jsp + javaBean +Dao 写的博客程序

    【标题】:“jsp + javaBean +Dao 写的博客程序” 这个标题揭示了一个基于Web的博客应用程序,它采用经典的Java Web开发技术栈:JSP(JavaServer Pages)、JavaBean和DAO(Data Access Object)模式。这是一个典型...

    一个servlet,javabean。的例子

    在IT行业中,Servlet和JavaBean是Java Web开发中的核心组件,尤其在构建动态网页和企业级应用程序时不可或缺。Servlet是一种Java编程语言的接口,用于扩展服务器的功能,而JavaBean则是一种符合特定规范的Java类,...

    javaBean--jsonObject--jsonString相互转化

    最近在研究Webservice的时候遇到一个问题,把java对象转化问json后传过去,接受的是String类型,怎么恢复到原来的java对象呢,后来再一个项目中看到了转换方法,转换顺序为javaBean--jsonObject--jsonString,还原...

    JAVABEAN方法实例

    为了确保这个JavaBean能运行,可能还有一个简单的测试类`shiyan2`,用于创建JavaBean对象并调用`findPosition()`方法: ```java public class Test { public static void main(String[] args) { StringSearchBean...

    SqlToJavaBean_javabean_根据表结构生成javabean_生成javabean_

    在Java开发中,JavaBean是一种遵循特定规范的Java类,通常用于封装数据并提供相应的getter和setter方法。在数据库操作中,将SQL查询结果映射到Java对象是常见的需求,这时JavaBean的作用就显现出来了。...

    javaBean实验报告.doc

    在本实验中,`information`类就是个简单的JavaBean,它包含`username`和`password`两个属性,以及对应的getter和setter方法。 - JavaBean需是公开的类,且有一个无参数的构造器,以便于在运行时实例化。 - 属性的...

    javabean一个简单的例子,可直接用

    在JavaBean中,通常有公有的属性(getter和setter方法)来存储和访问数据,以及可能包含一些业务逻辑的方法。JavaBean遵循的规则如下: 1. 类必须是公共的(`public`)。 2. 类必须有一个无参数的构造函数,通常是...

    javaBean简介.doc

    【JavaBean 简介】 JavaBean 是 Java 编程语言中的一种特殊类,它遵循特定的编程规范,主要用于封装数据和实现业务逻辑。在MVC(Model-View-Controller)设计模式中,JavaBean 作为 Model 层,是应用程序的数据载体...

    javabean概念和使用

    * 可视化的 bean 必须继承的类是 java.awt.Component,这样它们才能添加到可视化容器中去,非可视化 bean 则不需要继承这个类。 * JavaBean 可以看成是一个黑盒子,即只需要知道其功能而不必管其内部结构的软件设备...

    JavaBean_Javabean增删改查_audiencevu9_

    总的来说,这个项目"JavaBean_Javabean增删改查_audiencevu9_"涉及到Web开发的基础知识,包括JavaBean的设计和使用、Servlet的生命周期和请求处理、JSP的页面指令和表达式语言、以及数据库操作。通过实践这些,...

    javabean和xml互相转换工具类以及jar包

    下面我们将详细探讨如何实现JavaBean到XML以及XML到JavaBean的转换,并介绍一个用于此目的的工具类和相关的jar包。 首先,JavaBean是一种符合特定规范的Java类,它通常具有公共的getter和setter方法,用于封装属性...

    ( Test多表联合增删改查,struts两个JAVABEAN.rar

    在这个"Test多表联合增删改查,struts两个JAVABEAN.rar"压缩包中,我们可以推测其包含的内容是关于使用Struts进行多表联合操作的示例,以及两个相关的JavaBean类。 首先,多表联合查询在数据库操作中很常见,特别是...

    xml转javaBean,javaBean转xml,xml标签大小写问题,以及对xml特殊符号的处理

    本文将深入探讨XML与JavaBean之间的转换、XML标签的大小写规则、XML特殊符号的处理以及CDATA的生成。 1. XML转JavaBean: 在Java编程中,XML数据经常需要转换为Java对象以便于操作。这一过程通常通过XML解析器来...

    可用的jsp的MD5加密的javaBean

    MD5(Message-Digest Algorithm 5)是一种广泛用于数据安全的哈希函数,它能够将任意长度的数据转化为固定长度的128位(通常用32位的十六进制数表示)摘要信息。在IT行业中,MD5常用于数据校验、密码存储等方面,...

Global site tag (gtag.js) - Google Analytics