了解泛型、反射、单例模式的请进。
先贴上写好了的代码,问题在代码后面。
是一个简单的BeanUtil,具体的功能是复制VO的属性值到PO,如果VO的属性值为null则不复制。
第一个问题:是否所有用到Object做参数的地方都可以(或者有必要)写成泛型?
第二个问题:如果第一个问题的答案为true,我想把这个VO2PO类改写成泛型的VO2PO <V,P> ,该怎么改?
第三个问题:类似这样的工具类,你一般是如何设计?单例?静态方法类?还是一般的类?为什么?
是一个简单的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> ,该怎么改?
第三个问题:类似这样的工具类,你一般是如何设计?单例?静态方法类?还是一般的类?为什么?
...全文
相关推荐
JAVA反射机制与单例模式
访问私有成员:虽然不推荐,但反射可以绕过封装,直接访问私有属性和方法。4. 实现通用代码:比如泛型工具类,可以在运行时根据传入的类型进行操作。5.
泛型+反射
泛型+反射
C# .NET 课程(上)(包含三层结构)
反射的使用:创建和操作类型、成员、属性和事件,以及动态方法调用。5. 泛型的深入理解:泛型接口、泛型委托、约束等高级特性。6. 设计模式实践:分析和实现不同设计模式,理解其在实际项目中的应用。
SpringBoot_BaseDao.zip
通过学习这个压缩包中的内容,开发者可以加深对SpringBoot数据库操作的理解,掌握泛型和反射的实战技巧,并了解如何构建一个基础的DAO层。这将有助于提高开发效率和代码质量。
java面试100题,包含java基础等
十二、泛型Java 中的泛型是指类型参数。在泛型中,可以使用类型参数来表示类型。十三、反射Java 中的反射是指在运行时动态地获取类的信息和成员变量的值。反射可以用于实现依赖注入和动态代理。


Java SE
