package com.saicfc.saicifx3.util;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
import java.util.WeakHashMap;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
/**
* 实例辅助类
*
* @author ShenHuaJie
* @since 2012-07-18
*/
public class InstanceUtils {
/**
* JavaBean之间对象属性值拷贝
* @param pFromObj
* Bean源对象
* @param pToObj
* Bean目标对象
*/
public static void copyProperties(Object pFromObj, Object pToObj) {
copyProperties(pFromObj, pToObj, true);
}
/**
* JavaBean之间对象属性值拷贝
* @param pFromObj
* Bean源对象
* @param pToObj
* Bean目标对象
*/
public static void copyProperties(Object pFromObj, Object pToObj, boolean isNotNull) {
if (pFromObj != null && pToObj != null) {
if (isNotNull) {
Class> tc = pToObj.getClass();
Field[] fields = tc.getDeclaredFields();
Object value = null;
for (int i = 0; i < fields.length; i++) {
if (pFromObj instanceof Map, ?>) {
value = ((Map, ?>) pFromObj).get(fields[i].getName());
} else {
try {
value = PropertyUtils.getProperty(pFromObj, fields[i].getName());
} catch (Exception e) {
throw new InstanceException(e);
}
}
if (value != null) {
if (pToObj instanceof Map, ?>) {
((Map) pToObj).put(fields[i].getName(), value);
} else {
try {
value = TypeParseUtils.convert(value, fields[i].getType(), null);
PropertyUtils.setProperty(pToObj, fields[i].getName(), value);
} catch (Exception e) {
throw new InstanceException(e);
}
}
}
}
} else {
try {
if (pFromObj instanceof Map, ?>) {
BeanUtils.populate(pToObj, (Map, ?>) pFromObj);
} else {
PropertyUtils.copyProperties(pToObj, pFromObj);
}
} catch (Exception e) {
throw new InstanceException(e);
}
}
}
}
/**
* JavaBean之间对象属性值拷贝;
* @param pFromObj
* Bean源对象
* @param pToObj
* Bean目标对象
*/
public static void copyProperties(String prefix, String suffix, Object pFromObj, Object pToObj) {
if (pFromObj != null && pToObj != null) {
Class> tc = pToObj.getClass();
Field[] fields = tc.getDeclaredFields();
Object value = null;
String key = null;
for (int i = 0; i < fields.length; i++) {
if (prefix != null) {
key = prefix + fields[i].getName();
} else {
key = fields[i].getName();
}
if (suffix != null) {
key += suffix;
}
if (pFromObj instanceof Map, ?>) {
value = ((Map, ?>) pFromObj).get(key);
} else {
try {
value = PropertyUtils.getProperty(pFromObj, key);
} catch (Exception e) {
throw new InstanceException(e);
}
}
if (value != null && !"".equals(value)) {
if (pToObj instanceof Map, ?>) {
((Map) pToObj).put(fields[i].getName(), value);
} else {
try {
value = TypeParseUtils.convert(value, fields[i].getType(), null);
PropertyUtils.setProperty(pToObj, fields[i].getName(), value);
} catch (Exception e) {
System.out.println(value);
throw new InstanceException(e);
}
}
}
}
}
}
/**
* Return the specified class. Checks the ThreadContext classloader first,
* then uses the System classloader. Should replace all calls to
* Class.forName( claz )
(which only calls the System class
* loader) when the class might be in a different classloader (e.g. in a
* webapp).
*
* @param clazz
* the name of the class to instantiate
* @return the requested Class object
*/
public static Class> getClass(String clazz) {
/**
* Use the Thread context classloader if possible
*/
ClassLoader loader = Thread.currentThread().getContextClassLoader();
try {
if (loader != null) {
return Class.forName(clazz, true, loader);
}
/**
* Thread context classloader isn't working out, so use system loader.
*/
return Class.forName(clazz);
} catch (ClassNotFoundException e) {
throw new InstanceException(e);
}
}
/**
* 封装实体
*
* @param cls
* 实体类
* @param list
* 实体Map集合
* @return
*/
public static List getInstanceList(Class cls, List> list) {
List resultList = newArrayList();
E object = null;
for (Iterator> iterator = list.iterator(); iterator.hasNext();) {
Map, ?> map = (Map, ?>) iterator.next();
object = newInstance(cls, map);
resultList.add(object);
}
return resultList;
}
/**
* 封装实体
*
* @param cls
* 实体类
* @param list
* 数据查询结果集
* @return
*/
public static List getInstanceList(Class cls, ResultSet rs) {
List resultList = newArrayList();
try {
E object = cls.newInstance();
Field[] fields = cls.getDeclaredFields();
while (rs.next()) {
object = cls.newInstance();
for (int i = 0; i < fields.length; i++) {
String fieldName = fields[i].getName();
PropertyUtils.setProperty(object, fieldName, rs.getObject(fieldName));
}
resultList.add(object);
}
} catch (Exception e) {
throw new InstanceException(e);
}
return resultList;
}
/**
* 新建实例
*
* @param cls
* 实体类
* @param list
* 实体属性Map
* @return
*/
public static E newInstance(Class cls, Map, ?> map) {
E object = null;
try {
object = cls.newInstance();
BeanUtils.populate(object, map);
} catch (Exception e) {
throw new InstanceException(e);
}
return object;
}
/**
* Return a new instance of the given class. Checks the ThreadContext
* classloader first, then uses the System classloader. Should replace all
* calls to Class.forName( claz ).newInstance()
(which only
* calls the System class loader) when the class might be in a different
* classloader (e.g. in a webapp).
*
* @param clazz
* the name of the class to instantiate
* @return an instance of the specified class
*/
public static Object newInstance(String clazz) {
try {
return getClass(clazz).newInstance();
} catch (Exception e) {
throw new InstanceException(e);
}
}
/**
* 新建实例
*
* @param className
* 类名
* @param args
* 构造函数的参数
* @return 新建的实例
*/
public static Object newInstance(String className, Object[] args) {
try {
Class> newoneClass = Class.forName(className);
Class>[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Constructor> cons = newoneClass.getConstructor(argsClass);
return cons.newInstance(args);
} catch (Exception e) {
throw new InstanceException(e);
}
}
/**
* 执行某对象方法
*
* @param owner
* 对象
* @param methodName
* 方法名
* @param args
* 参数
* @return 方法返回值
*/
public static Object invokeMethod(Object owner, String methodName, Object[] args) {
Class> ownerClass = owner.getClass();
Class>[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
try {
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
} catch (Exception e) {
throw new InstanceException(e);
}
}
/**
* Constructs an empty ArrayList.
*/
public static ArrayList newArrayList() {
return new ArrayList();
}
/**
* Constructs an empty HashMap.
*/
public static HashMap newHashMap() {
return new HashMap();
}
/**
* Constructs an empty HashSet.
*/
public static HashSet newHashSet() {
return new HashSet();
}
/**
* Constructs an empty Hashtable.
*/
public static Hashtable newHashtable() {
return new Hashtable();
}
/**
* Constructs an empty LinkedHashMap.
*/
public static LinkedHashMap newLinkedHashMap() {
return new LinkedHashMap();
}
/**
* Constructs an empty LinkedHashSet.
*/
public static LinkedHashSet newLinkedHashSet() {
return new LinkedHashSet();
}
/**
* Constructs an empty LinkedList.
*/
public static LinkedList newLinkedList() {
return new LinkedList();
}
/**
* Constructs an empty TreeMap.
*/
public static TreeMap newTreeMap() {
return new TreeMap();
}
/**
* Constructs an empty TreeSet.
*/
public static TreeSet newTreeSet() {
return new TreeSet();
}
/**
* Constructs an empty Vector.
*/
public static Vector newVector() {
return new Vector();
}
/**
* Constructs an empty WeakHashMap.
*/
public static WeakHashMap newWeakHashMap() {
return new WeakHashMap();
}
/**
* Constructs an empty HashMap.
*/
public static Map newHashMap(k key, v value) {
Map map = newHashMap();
map.put(key, value);
return map;
}
}
@SuppressWarnings("serial")
class InstanceException extends RuntimeException {
public InstanceException() {
super();
}
public InstanceException(Throwable t) {
super(t);
}
}
分享到:
2014-04-23 17:34
浏览 101
评论