了解泛型、反射、单例模式的请进。

codeartisan 2008-01-26 06:58:24
先贴上写好了的代码,问题在代码后面。
是一个简单的BeanUtil,具体的功能是复制VO的属性值到PO,如果VO的属性值为null则不复制。

package net.javayuan.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
* @(#)VO2PO.java Jan 23, 2008 9:00:55 AM
*
* @author Yuan
* VO到PO的属性复制工具
*/
public class VO2PO {

private static final VO2PO INSTANCE = new VO2PO();

private VO2PO(){
//
}

public static VO2PO getInstance(){
return INSTANCE;
}

/**
* 复制属性
* @param vo 源对象
* @param po 目标对象
* */
public void copyProperties(Object vo, Object po){

Class<?> voClass = vo.getClass();
Class<?> poClass = po.getClass();

Method[] methods = voClass.getDeclaredMethods();

for (Method method : methods){
String methodName = method.getName();
String fieldName = "";
String setterName = "";

if (methodName.startsWith("get")){
fieldName = methodName.substring(3,4).toLowerCase() + methodName.substring(4);
setterName = "set" + methodName.substring(3);
}

if (methodName.startsWith("is")){
fieldName = methodName.substring(2,3).toLowerCase() + methodName.substring(3);
setterName = "set" + methodName.substring(2);
}

if (!"".equals(fieldName)){
try {
Object o = method.invoke(vo, new Object[]{});
if (o != null){
Class<?> fieldType = poClass.getDeclaredField(fieldName).getType();
Method setter = poClass.getDeclaredMethod(setterName, fieldType);
setter.invoke(po, o);
}
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (SecurityException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InvocationTargetException ex) {
ex.printStackTrace();
} catch (NoSuchMethodException ex) {
ex.printStackTrace();
} catch (NoSuchFieldException ex) {
ex.printStackTrace();
}
}
}
}
public static void main(String[] args){
Bean bean1 = new Bean();
bean1.setBooleanValue(true);
bean1.setStringValue(null);
bean1.setIntValue(321);

Bean bean2 = new Bean();
bean2.setBooleanValue(false);
bean2.setStringValue("bean2");
bean2.setIntValue(123);

VO2PO.getInstance().copyProperties(bean1, bean2);

System.out.println(bean2.getIntValue());
System.out.println(bean2.getStringValue());
System.out.println(bean2.isBooleanValue());
}
}

class Bean{

private int intValue;
private String stringValue;
private boolean booleanValue;

public int getIntValue() {
return intValue;
}

public void setIntValue(int intValue) {
this.intValue = intValue;
}

public String getStringValue() {
return stringValue;
}

public void setStringValue(String stringValue) {
this.stringValue = stringValue;
}

public boolean isBooleanValue() {
return booleanValue;
}

public void setBooleanValue(boolean booleanValue) {
this.booleanValue = booleanValue;
}
}


第一个问题:是否所有用到Object做参数的地方都可以(或者有必要)写成泛型?
第二个问题:如果第一个问题的答案为true,我想把这个VO2PO类改写成泛型的VO2PO <V,P> ,该怎么改?
第三个问题:类似这样的工具类,你一般是如何设计?单例?静态方法类?还是一般的类?为什么?
...全文
249 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
第二个问题:改用泛型参数加以限制。

public static <V, P extends V> void aMethod(V vo, P po);
caiming250 2008-01-26
  • 打赏
  • 举报
回复
1 ture
2 个人理解: 对于单体模式 我们是不能运用 范型类的 因为:范型是一个编译器行为.
如果 编译时 我们在单体模式上面可以使用范型类 我们就可以声明各种范型的单体(如:VO2PO<Bean,Bean>的单体 和 VO2PO<OtherBean,Bean> 的单体 注意: 这两个单体是是两个对象)
可是 在运行时 我们只能够让VO2PO 存在一个单体 也就是一个VO2PO对象 这与编译时的两个VO2PO对象发生了冲突 所以不能对单体模式使用范型
3 如果真如我理解的 对于单体模式我们没有办法使用范型类 就只有这样: 将对范型的支持丢到方法上面 把你的copyProperties 方法声明成范型方法



/**
* Object1 和 Object2 分别是你的V 父类 和P父类
*/
public <V extends Object1,P extends Object2> void copyProperties(V vo, P po){

//action......

}

wddaff2008 2008-01-26
  • 打赏
  • 举报
回复
uuuuuuuuuuuuuuuuuuuuuuuuuu
  • 打赏
  • 举报
回复
对于这个程序而言,我认为有些地方可以改进一下:
1,Introspector.getBeanInfo(Class);获得BeanInfo实例;
2,beanInfo.getPropertyDescriptors();获得Bean中所有的PropertyDescriptor,即属性描述;
3,PropertyDescriptor中有getReadMethod()和getWriteMethod()方法取得Bean的set/get的Method;
4,再通过Method进行操作。

复制整个属性,必须保证第一个参数与第二参数是同一种类型,或者是第一参数是第二个参数的父类,第二个参数只能是子类。如果第二个参数是父类,而第一个参数是子类可能造成复制失败,我认为应该采用泛型进行约束。

第三个问题,我认为应采用静态方法且将构造置为private(不允许产生实例),主要是由于工具类无须与其他的类进行交互,或者与其他的类毫无关系,可以在任何时候、任何状态下进行操作,工具类是没有必要产生实例的,比如:JDK中的System、Math、Arrays等等。
cangyue87 2008-01-26
  • 打赏
  • 举报
回复
为什么又是竹子的1楼....

我已经连续3天揭不开锅了....
老紫竹 2008-01-26
  • 打赏
  • 举报
回复
1 是的,至少我还没遇到不能的,泛型主要是增加编译期间的检查。
2 有一些通用类,不能加泛型,不如JSP里面的session, 我们无法预期里面保存什么,而且也不能那样做,所以最终是Object。和没写是一样的。
3 至于是否能单例。我的理解,如果都是方法,不涉及到类一级的属性,则可以。 也就是无状态的类。 每个访问对类来说都是全新的。

waterborn 2008-01-26
  • 打赏
  • 举报
回复
没仔细看. 我复制非NULL值的属性到dest Bean 是这么做的
用了apache 的BeanUtil.jar

public static void copyBeanNotNullProperty(Object dest, Object orig) throws IllegalAccessException,
InvocationTargetException {
// Validate existence of the specified beans
if (dest == null) {
throw new IllegalArgumentException("No destination bean specified");
}
if (orig == null) {
throw new IllegalArgumentException("No origin bean specified");
}
if (orig instanceof Map) {
throw new IllegalArgumentException("No support map");
}

/* if (orig is a standard JavaBean) */
PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(orig);
for (int i = 0; i < origDescriptors.length; i++) {
String name = origDescriptors[i].getName();
if ("class".equals(name)) {
continue; // No point in trying to set an object's class
}
if (PropertyUtils.isReadable(orig, name) && PropertyUtils.isWriteable(dest, name)) {
try {
Object value = PropertyUtils.getSimpleProperty(orig, name);
if (value != null) {
BeanUtils.copyProperty(dest, name, value);
}
} catch (NoSuchMethodException e) {
}
}
}

}
本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领读者从基础到各个知识点行学习。全书内容由浅入深,并辅以大量的实例说明,书本阶段性地提供了一些实验指导。 本书提供了所有实例的源代码以及开发过程中用到的软件下载地址,供读者学习参考使用。 本书为学校教学量身定做,供高校面向对象技术相关课程使用,对于缺乏项目实战经验的程序员来说可用于快速积累项目开发经验。 本书是中南大学精品教材建设中的一本特色教材,为高校计算机相关专业提供面向对象技术和UML的讲解。本书采用Java语言行描述,针对Java技术标准编程行详细的讲解,以简单通俗易懂的案例,逐步引领读者从基础到各个知识点行学习。本书涵盖了JavaSE开发环境配置、程序设计基础、面向对象相关技术、常用API、UML基础知识。在章节中穿插了上机习题,并提供了答案,用于对该章内容行阶段性总结演练。 作者长期从事教学工作,积累了丰富的经验,其“实战教学法”取得了很好的效果。本书适合教学。书中章节安排适当,将习题融于讲解的过程中,教师可以根据情况选用,也可以行适当增减。 本书的知识体系结构如下所示,遵循了循序渐的原则,逐步引领读者从基础到各个知识点行学习。 上篇面向对象技术 第1章Java入门 第2章程序设计基础: 变量及其运算 第3章程序设计基础: 流程控制和数组 第4章实验指导1 第5章类、对象和成员 第6章封装 第7章继承和多态 第8章实验指导2 第9章异常处理 第10章Java常用API 第11章Java IO操作 第12章多线程开发 第13章反射技术 第14章实验指导3 下篇UML 第15章UML入门 第16章用例图 第17章类图和对象图 第18章实验指导4 第19章顺序图、协作图、状态图和活动图 第20章包图、构件图和部署图 第21章实验指导5 本书提供了全书所有实例的源代码,供读者学习参考使用,所有程序均经过了作者精心的调试。 由于时间仓促和作者水平有限,书中的错误和不妥之处敬读者批评指正。 有关本书的意见反馈和咨询,读者可在清华大学出版社相关版块中与作者行交流。 郭克华 2013年11月 目录 上篇面向对象技术 第1章Java入门 1.1认识Java 1.1.1认识编程语言 1.1.2Java的来历 1.1.3Java为什么流行 1.1.4Java的三个版本 1.1.5编程前的准备工作 1.2安装JDK 1.2.1获取JDK 1.2.2安装JDK步骤 1.2.3安装目录介绍 1.2.4环境变量设置 1.3开发第一个Java程序 1.3.1如何编写源代码 1.3.2如何将源代码编译成.class文件 1.3.3如何执行.class文件 1.3.4新手常见错误 1.4用Eclipse开发Java程序 1.4.1Eclipse的概念 1.4.2安装Eclipse 1.4.3如何建立项目 1.4.4如何开发Java程序 1.4.5如何维护项目 1.5小结 第2章程序设计基础:变量及其运算 2.1认识变量 2.1.1变量的定义 2.1.2变量有哪些类型 2.2如何使用变量 2.2.1如何使用整型变量 2.2.2如何使用浮点型变量 2.2.3如何使用字符型变量 2.2.4如何使用布尔型变量 2.2.5基本数据类型之间的类型转换 2.2.6基本数据类型和字符串之间的转换 2.2.7变量的作用范围 2.3注释的书写 2.4Java中的运算 2.4.1算术运算 2.4.2赋值运算 2.4.3关系运算 2.4.4逻辑运算 2.4.5运算符的优先级 2.5小结 第3章程序设计基础:流程控制和数组 3.1判断结构 3.1.1为什么需要判断结构 3.1.2if结构 3.1.3switch结构 3.2认识循环结构 3.2.1为什么需要循环结构 3.2.2while循环 3.2.3dowhile循环 3.2.4for循环 3.2.5循环嵌套 3.2.6break和continue 3.3数组 3.3.1为什么需要数组 3.3.2如何定义数组 3.3.3如何使用数组 3.3.4数组的引用性质 3.3.5数组的应用 3.3.6多维数组 3.4小结 第4章实验指导1 4.1关于变量和数据类型的实践 4.2流程控制和数组的综合实践 第5章类、对象和成员 5.1认识类和对象 5.1.1为什么需要类 5.1.2如何定义类 5.1.3如何使用类实例化对象 5.1.4如何访问对象中的成员变量 5.1.5对象的引用性质 5.2认识成员函数 5.2.1为什么需要函数 5.2.2如何定义和使用成员函数 5.2.3函数参数的传递 5.2.4认识函数重载 5.3认识构造函数 5.3.1为什么需要构造函数 5.3.2如何定义和使用构造函数 5.4静态变量和静态函数 5.4.1为什么需要静态变量 5.4.2静态变量的常见应用 5.4.3认识静态函数 5.4.4静态代码块 5.5小结 第6章封装 6.1使用封装 6.1.1为什么需要封装 6.1.2如何实现封装 6.2使用包 6.2.1为什么需要包 6.2.2如何将类放在包中 6.2.3如何访问包中的类 6.3使用访问控制修饰符 6.3.1什么是访问控制修饰符 6.3.2类的访问控制修饰符 6.3.3成员的访问控制修饰符 6.4使用类中类 6.5小结 第7章继承和多态 7.1使用继承 7.1.1为什么需要继承 7.1.2如何实现继承 7.1.3继承的底层本质 7.2成员的覆盖 7.2.1什么是成员覆盖 7.2.2成员覆盖有何作用 7.3使用多态性 7.3.1什么是多态 7.3.2如何使用多态性 7.3.3父子类对象的类型转换 7.4抽象类和接口 7.4.1为什么需要抽象类 7.4.2为什么需要接口 7.5其他内容 7.5.1final关键字 7.5.2Object类 7.6一些工具的使用 7.6.1将字节码打包发布 7.6.2文档的使用 7.7小结 第8章实验指导2 8.1单例模式的设计 8.1.1需求简介 8.1.2不用单例模式的效果 8.1.3最原始的单例模式 8.1.4首次改 8.1.5再次改 8.1.6思考题 8.2利用继承和多态扩充程序功能 8.2.1需求简介 8.2.2实现方法 8.2.3出现的问题 8.2.4改 8.2.5测试 第9章异常处理 9.1认识异常 9.1.1生活中的异常 9.1.2软件中的异常 9.1.3为什么要处理异常 9.1.4异常机理 9.1.5常见异常 9.2异常的就地捕获 9.2.1为什么要就地捕获 9.2.2如何就地捕获异常 9.2.3如何捕获多种异常 9.2.4用finally保证安全性 9.3异常的向前抛出 9.3.1为什么要向前抛出 9.3.2如何向前抛出 9.4自定义异常 9.4.1为什么需要自定义异常 9.4.2如何自定义异常 9.5小结 第10章Java常用API 10.1数值运算 10.1.1用Math类实现数值运算 10.1.2实现随机数 10.2用String类行字符串处理 10.3用StringBuffer类行字符串处理 10.4基本数据类型的包装类 10.4.1认识包装类 10.4.2通过包装类行数据转换 10.5认识Java集合 10.5.1为什么需要集合 10.5.2Java中的集合 10.6使用一维集合 10.6.1认识一维集合 10.6.2使用List集合 10.6.3使用Set集合 10.6.4使用Collections类对集合行处理 10.6.5使用泛型简化集合操作 10.7Java中的二维集合 10.7.1使用Map集合 10.7.2使用Hashtable和Properties 10.8小结 第11章Java IO操作 11.1认识IO操作 11.2用File类操作文件 11.2.1认识File类 11.2.2使用File类操作文件 11.2.3使用File类操作目录 11.3字节流的输入输出 11.3.1认识字节流 11.3.2如何读写文件 11.3.3如何读写对象 11.4字符流的输入输出 11.4.1认识字符流 11.4.2如何读写文件 11.4.3如何行键盘输入 11.5和IO操作相关的其他类 11.5.1用RandomAccessFile类行文件读写 11.5.2使用Properties类 11.6小结 第12章多线程开发 12.1认识多线程 12.1.1为什么需要多线程 12.1.2继承Thread类开发多线程 12.1.3实现Runnable接口开发多线程 12.1.4两种方法有何区别 12.2控制线程运行 12.2.1为什么要控制线程运行 12.2.2传统方法的安全问题 12.2.3如何控制线程的运行 12.3线程同步安全 12.3.1什么是线程同步 12.3.2一个有问题的案例 12.3.3如何解决 12.3.4小心线程死锁 12.4认识定时器 12.4.1为什么需要定时器 12.4.2如何使用定时器 12.5小结 第13章反射技术 13.1为什么要学习反射 13.1.1引入配置文件 13.1.2配置文件遇到的问题 13.2认识Class类 13.2.1什么是Class类 13.2.2如何获取一个类对应的Class对象 13.2.3如何获取类中的成员信息 13.3通过反射机制访问对象 13.3.1如何实例化对象 13.3.2如何给成员变量赋值 13.3.3如何调用成员函数 13.4何时使用反射 13.5动态异常处理框架 13.5.1框架功能简介 13.5.2重要技术 13.5.3框架代码编写 13.5.4使用该框架 13.6小结 第14章实验指导3 14.1字符频率统计软件 14.1.1软件功能简介 14.1.2重要技术 14.1.3项目结构 14.1.4代码编写 14.1.5思考题 14.2文本翻译软件 14.2.1软件功能简介 14.2.2重要技术 14.2.3项目结构 14.2.4代码编写 14.2.5思考题 14.3用享元模式优化程序性能 14.3.1为什么需要享元模式 14.3.2重要技术 14.3.3代码编写 14.3.4思考题 下篇UML 第15章UML入门 15.1认识UML 15.1.1为什么需要UML 15.1.2UML的来历 15.2用Rational Rose行UML建模 15.2.1什么是Rational Rose 15.2.2安装Rational Rose 15.2.3如何使用Rational Rose 15.2.4UML图的种类 15.3小结 第16章用例图 16.1认识用例图 16.1.1为什么需要用例图 16.1.2什么是用例图 16.2详解用例图 16.2.1系统边界 16.2.2参与者 16.2.3用例 16.2.4箭头 16.2.5注释 16.2.6用Rational Rose画用例图 16.2.7用例规约 16.3一个案例 16.3.1案例描述 16.3.2画出用例图 16.3.3写出用例描述 16.4小结 第17章类图和对象图 17.1认识类图 17.1.1为什么需要类图 17.1.2什么是类图 17.2详解类图 17.2.1类 17.2.2箭头 17.2.3注释 17.2.4用Rational Rose画类图 17.3对象图 17.4小结 第18章实验指导4 18.1用例图练习 18.1.1软件功能简介 18.1.2识别系统中的参与者和用例 18.1.3画出用例图 18.1.4用例描述 18.2类图练习 18.2.1练习1: 根据代码画出类图 18.2.2练习2: 根据需求构建类图 18.3思考题 第19章顺序图、协作图、状态图和活动图 19.1顺序图 19.1.1什么是顺序图 19.1.2详解顺序图 19.1.3用Rational Rose画顺序图 19.2协作图 19.2.1什么是协作图 19.2.2详解协作图 19.2.3用Rational Rose画协作图 19.3状态图 19.3.1什么是状态图 19.3.2详解状态图 19.3.3用Rational Rose画状态图 19.4活动图 19.4.1什么是活动图 19.4.2详解活动图 19.4.3用Rational Rose画活动图 19.5小结 第20章包图、构件图和部署图 20.1包图 20.1.1什么是包图 20.1.2详解包图 20.1.3用Rational Rose画包图 20.2构件图 20.2.1什么是构件图 20.2.2详解构件图 20.2.3用Rational Rose画构件图 20.3部署图 20.3.1什么是部署图 20.3.2详解部署图 20.3.3用Rational Rose画部署图 20.4小结 第21章实验指导5 21.1顺序图、协作图练习 21.1.1功能简介 21.1.2创建顺序图 21.1.3创建协作图 21.2状态图、活动图练习 21.2.1功能简介 21.2.2创建状态图 21.2.3创建活动图 21.3包图、构件图和部署图练习

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧