com.frameworkset.common.util.ValueObjectUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bboss-util Show documentation
Show all versions of bboss-util Show documentation
bboss is a j2ee framework include aop/ioc,mvc,persistent,taglib,rpc,event ,bean-xml serializable and so on.http://www.bbossgroups.com
/*****************************************************************************
* *
* This file is part of the tna framework distribution. *
* Documentation and updates may be get from biaoping.yin the author of *
* this framework *
* *
* Sun Public License Notice: *
* *
* The contents of this file are subject to the Sun Public License Version *
* 1.0 (the "License"); you may not use this file except in compliance with *
* the License. A copy of the License is available at http://www.sun.com *
* *
* The Original Code is tag. The Initial Developer of the Original *
* Code is biaoping yin. Portions created by biaoping yin are Copyright *
* (C) 2000. All Rights Reserved. *
* *
* GNU Public License Notice: *
* *
* Alternatively, the contents of this file may be used under the terms of *
* the GNU Lesser General Public License (the "LGPL"), in which case the *
* provisions of LGPL are applicable instead of those above. If you wish to *
* allow use of your version of this file only under the terms of the LGPL *
* and not to allow others to use your version of this file under the SPL, *
* indicate your decision by deleting the provisions above and replace *
* them with the notice and other provisions required by the LGPL. If you *
* do not delete the provisions above, a recipient may use your version of *
* this file under either the SPL or the LGPL. *
* *
* biaoping.yin ([email protected]) *
* *
*****************************************************************************/
package com.frameworkset.common.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.Serializable;
import java.io.Writer;
import java.lang.reflect.Method;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.frameworkset.util.DataFormatUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.frameworkset.common.poolman.NestedSQLException;
import com.frameworkset.util.SimpleStringUtil;
import bsh.Interpreter;
/**
* @author biaoping.yin
* 改类充分使用java.lang.reflection中提供的功能,提供以下工具:
* 从对象中获取对应属性的值
*/
public class ValueObjectUtil {
private static final Logger log = LoggerFactory.getLogger(ValueObjectUtil.class);
// private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
/**
* Description:获取对象obj的property属性值
* @param obj
* @param property
* @return
* Object
*/
public static Object getValue(Object obj, String property) {
return getValue(obj, property,null);
}
/**
* Description:获取对象obj的property属性值,params为参数数组
* @param obj
* @param property
* @param params 获取属性方法值的参数
* @return
* Object
*/
public static Object getValue(Object obj, String property,Object[] params) {
if (obj == null || property == null || property.trim().length() == 0)
return null;
Object ret = getValueByMethodName(obj, getMethodName(property), params);
if(ret == null)
{
//log.debug("Try to get Boolean attribute for property[" + property + "].");
ret = getValueByMethodName(obj, getBooleanMethodName(property), params);
if(ret != null)
log.debug("Get Boolean property[" + property + "=" + ret + "].");
}
return ret;
}
/**
* Description:根据方法名称获取,
* 在对象obj上调用改方法并且返回调用的返回值
* @param obj
* @param methodName 方法名称
* @param params 方法的参数
* @return
* Object
*/
public static Object getValueByMethodName(
Object obj,
String methodName,
Object[] params) {
if (obj == null
|| methodName == null
|| methodName.trim().length() == 0)
return null;
return getValueByMethodName(obj, methodName, params,null);
}
/**
* Description:根据方法名称获取,
* 在对象obj上调用改方法并且返回调用的返回值
* @param obj
* @param methodName 方法名称
* @param params 方法的参数
* @param paramsTtype 方法的参数类型
* @return
* Object
*/
public static Object getValueByMethodName(
Object obj,
String methodName,
Object[] params,
Class[] paramsTtype) {
if (obj == null
|| methodName == null
|| methodName.trim().length() == 0)
return null;
try {
Method method = obj.getClass().getMethod(methodName, paramsTtype);
if (method != null)
return method.invoke(obj, params);
} catch (Exception e) {
//e.printStackTrace();
log.info("NoSuchMethodException:" + e.getMessage());
}
return null;
}
/**
* Description:实现在对象调用method并为该方法传入参数数组params
* @param obj 对象
* @param method 待调用的方法
* @param params 参数数组
* @return Object
* @throws Exception
* Object
*/
public static Object invoke(Object obj, Method method, Object[] params)
throws Exception {
return method.invoke(obj, params);
}
/**
* 获取fieldName的getter方法名称
* @param fieldName
* @return String
*/
public static String getMethodName(String fieldName) {
String ret = null;
if (fieldName == null)
return null;
String letter = String.valueOf(fieldName.charAt(0));
letter = letter.toUpperCase();
ret = "get" + letter + fieldName.substring(1);
//System.out.println("method name:" + ret);
return ret;
}
public static String getBooleanMethodName(String fieldName) {
String ret = null;
if (fieldName == null)
return null;
String letter = String.valueOf(fieldName.charAt(0));
letter = letter.toUpperCase();
ret = "is" + letter + fieldName.substring(1);
//System.out.println("method name:" + ret);
return ret;
}
/**
* 获取fieldName的setter方法
* @param fieldName
* @return String
*/
public static String getSetterMethodName(String fieldName) {
String ret = null;
if (fieldName == null)
return null;
String letter = String.valueOf(fieldName.charAt(0));
letter = letter.toUpperCase();
ret = "set" + letter + fieldName.substring(1);
//System.out.println("method name:" + ret);
return ret;
}
public final static boolean isSameType(Class type, Class toType)
{
if(toType == Object.class)
return true;
else if(type == toType)
return true;
else if(toType.isAssignableFrom(type))//检查toType是不是type的父类或者是type所实现的接口
{
return true;
}
else if((type == int.class && toType == Integer.class) ||
type == Integer.class && toType == int.class)
{
return true;
}
else if((type == short.class && toType == Short.class) ||
type == Short.class && toType == short.class)
{
return true;
}
else if((type == long.class && toType == Long.class) ||
type == Long.class && toType == long.class)
{
return true;
}
else if((type == double.class && toType == Double.class) ||
type == Double.class && toType == double.class)
{
return true;
}
else if((type == float.class && toType == Float.class) ||
type == Float.class && toType == float.class)
{
return true;
}
else if((type == char.class && toType == Character.class) ||
type == Character.class && toType == char.class)
{
return true;
}
return false;
}
/**
* 将obj对象从类型type转换到类型toType
* 支持字符串向其他基本类行转换:
* 支持的类型:
* int,char,short,double,float,long,boolean,byte
* java.sql.Date,java.util.Date,
* Integer
* Long
* Float
* Short
* Double
* Character
* Boolean
* Byte
* @param obj
* @param type
* @param toType
* @return Object
* @throws ClassCastException,NumberFormatException,IllegalArgumentException
*/
public final static Object typeCast(Object obj, Class type, Class toType)
throws
NoSupportTypeCastException,
NumberFormatException,
IllegalArgumentException {
if(obj == null)
return null;
if(isSameType(type,toType))
return obj;
if(type.isAssignableFrom(toType)) //type是toType的父类,父类向子类转换的过程,这个转换过程是不安全的
{
// return shell(toType,obj);
if(!java.util.Date.class.isAssignableFrom(type))
return toType.cast(obj);
}
if(type == byte[].class && toType == String.class)
{
return new String((byte[])obj);
}
else if(type == String.class && toType == byte[].class)
{
return ((String)obj).getBytes();
}
else if(type == byte[].class && File.class.isAssignableFrom(toType))
{
Object[] object = (Object[])obj;
java.io.ByteArrayInputStream byteIn = null ;
java.io.FileOutputStream fileOut = null;
try {
byteIn = new java.io.ByteArrayInputStream((byte[])object[0]) ;
fileOut = new java.io.FileOutputStream((File)object[1]);
byte v[] = new byte[1024];
int i = 0;
while ((i = byteIn.read(v)) > 0) {
fileOut.write(v,0,i);
}
fileOut.flush();
return object[1];
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
if(byteIn != null)
byteIn.close();
}
catch(Exception e)
{
}
try
{
if(fileOut != null)
fileOut.close();
}
catch(Exception e)
{
}
}
}
else if(File.class.isAssignableFrom(toType) && toType == byte[].class)
{
java.io.FileInputStream in = null;
java.io.ByteArrayOutputStream out = null;
try
{
int i = 0;
in = new FileInputStream((File)obj);
out = new ByteArrayOutputStream();
byte v[] = new byte[1024];
while((i = in.read(v)) > 0)
{
out.write(v, 0, i);
}
return out.toByteArray();
}
catch(Exception e)
{
}
finally
{
try
{
if(in != null)
in.close();
}
catch(Exception e)
{
}
try
{
if(out != null)
out.close();
}
catch(Exception e)
{
}
}
}
else if(type.isArray() && !toType.isArray()
|| !type.isArray() && toType.isArray())
{
// if (type.getName().startsWith("[")
// && !toType.getName().startsWith("[")
// || !type.getName().startsWith("[")
// && toType.getName().startsWith("["))
throw new IllegalArgumentException(
new StringBuilder("类型无法转换,不支持[")
.append(type.getName())
.append("]向[")
.append(toType.getName())
.append("]转换")
.toString());
}
Object arrayObj;
/**
* 基本类型转换
*/
if (!type.isArray()) {
arrayObj = basicTypeCast(obj, type, toType);
}
/**
* 字符串数组向其他类型数组之间转换
*/
else {
arrayObj = arrayTypeCast(obj, type, toType);
}
return arrayObj;
}
public static Object shell(Class toType,Object obj)
{
Interpreter interpreter = new Interpreter();
String shell = toType.getName() + " ret = (" + toType.getName() + ")obj;return ret;";
try
{
interpreter.set("obj", obj);
Object ret = interpreter.eval(shell);
return ret;
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
/**
* Description:基本的数据类型转圜
* @param obj
* @param type
* @param toType
* @return Object
* @throws NoSupportTypeCastException
* @throws NumberFormatException
*
*/
public final static Object basicTypeCast(
Object obj,
Class type,
Class toType)
throws NoSupportTypeCastException, NumberFormatException {
SimpleDateFormat format = DataFormatUtil.getSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if(obj == null)
return null;
if (isSameType(type,toType ))
return obj;
if(type.isAssignableFrom(toType)) //type是toType的父类,父类向子类转换的过程,这个转换过程是不安全的
{
if(!java.util.Date.class.isAssignableFrom(type))
return shell(toType,obj);
}
/**
* 如果obj的类型不是String型时直接抛异常,
* 不支持非字符串和字符串数组的类型转换
*/
// if (type != String.class)
// throw new NoSupportTypeCastException(
// new StringBuilder("不支持[")
// .append(type)
// .append("]向[")
// .append(toType)
// .append("]的转换")
// .toString());
/*******************************************
* 字符串向基本类型及其包装器转换 *
* 如果obj不是相应得数据格式,将抛出 *
* NumberFormatException *
******************************************/
if (toType == long.class || toType == Long.class)
return new Long(obj.toString());
if (toType == int.class || toType == Integer.class)
return new Integer(obj.toString());
if (toType == float.class || toType == Float.class)
return new Float(obj.toString());
if (toType == short.class || toType == Short.class)
return new Short(obj.toString());
if (toType == double.class || toType == Double.class)
return new Double(obj.toString());
if (toType == char.class || toType == Character.class)
return new Character(obj.toString().charAt(0));
if (toType == boolean.class || toType == Boolean.class)
return new Boolean(obj.toString());
if (toType == byte.class || toType == Byte.class)
return new Byte(obj.toString());
//如果是字符串则直接返回obj.toString()
if (toType == String.class)
{
if (obj instanceof java.util.Date)
return format.format(obj);
return obj.toString();
}
/**
* 字符串向java.util.Date和java.sql.Date 类型转换
*/
if (toType == java.util.Date.class)
{
// if(obj instanceof java.sql.Date
// || obj instanceof java.sql.Time
// || obj instanceof java.sql.Timestamp)
if(java.util.Date.class.isAssignableFrom(obj.getClass()))
return obj;
try {
return format.parse(obj.toString());
} catch (ParseException e) {
e.printStackTrace();
}
return new java.util.Date(obj.toString());
}
if (toType == java.sql.Date.class)
{
// if(obj instanceof java.sql.Date
// || obj instanceof java.sql.Time
// || obj instanceof java.sql.Timestamp)
if(java.util.Date.class.isAssignableFrom(obj.getClass()))
return new java.sql.Date(((java.util.Date)obj).getTime());
java.sql.Date date = java.sql.Date.valueOf(obj.toString());//(new java.util.Date(obj.toString()).getTime());
return date;
}
throw new NoSupportTypeCastException(
new StringBuilder("不支持[")
.append(type)
.append("]向[")
.append(toType)
.append("]的转换")
.toString());
}
/**
* 数组类型转换
* 支持字符串数组向一下类型数组得自动转换:
* int[]
* Integer[]
* long[]
* Long[]
* short[]
* Short[]
* double[]
* Double[]
* boolean[]
* Boolean[]
* char[]
* Character[]
* float[]
* Float[]
* byte[]
* Byte[]
* java.sql.Date[]
* java.util.Date[]
* @param obj
* @param type
* @param toType
* @return Object
* @throws NoSupportTypeCastException
* @throws NumberFormatException
*/
public final static Object arrayTypeCast(
Object obj,
Class type,
Class toType)
throws NoSupportTypeCastException, NumberFormatException {
if (isSameType(type,toType ))
return obj;
// if (type != String[].class)
// throw new NoSupportTypeCastException(
// new StringBuilder("不支持[")
// .append(type)
// .append("]向[")
// .append(toType)
// .append("]的转换")
// .toString());
if (toType == long[].class) {
String[] values = (String[]) obj;
long[] ret = new long[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = Long.parseLong(values[i]);
}
return ret;
}
if (toType == Long[].class) {
String[] values = (String[]) obj;
Long[] ret = new Long[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = new Long(values[i]);
}
return ret;
}
if (toType == int[].class) {
String[] values = (String[]) obj;
int[] ret = new int[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = Integer.parseInt(values[i]);
}
return ret;
}
if (toType == Integer[].class) {
String[] values = (String[]) obj;
Integer[] ret = new Integer[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = new Integer(values[i]);
}
return ret;
}
if (toType == float[].class) {
String[] values = (String[]) obj;
float[] ret = new float[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = Float.parseFloat(values[i]);
}
return ret;
}
if (toType == Float[].class) {
String[] values = (String[]) obj;
Float[] ret = new Float[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = new Float(values[i]);
}
return ret;
}
if (toType == short[].class) {
String[] values = (String[]) obj;
short[] ret = new short[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = Short.parseShort(values[i]);
}
return ret;
}
if (toType == Short[].class) {
String[] values = (String[]) obj;
Short[] ret = new Short[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = new Short(values[i]);
}
return ret;
}
if (toType == double[].class) {
String[] values = (String[]) obj;
double[] ret = new double[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = Double.parseDouble(values[i]);
}
return ret;
}
if (toType == Double[].class) {
String[] values = (String[]) obj;
Double[] ret = new Double[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = new Double(values[i]);
}
return ret;
}
if (toType == char[].class) {
String[] values = (String[]) obj;
char[] ret = new char[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = values[i].charAt(0);
}
return ret;
}
if (toType == Character[].class) {
String[] values = (String[]) obj;
Character[] ret = new Character[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = new Character(values[i].charAt(0));
}
return ret;
}
if (toType == boolean[].class) {
String[] values = (String[]) obj;
boolean[] ret = new boolean[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = new Boolean(values[i]).booleanValue();
}
return ret;
}
if (toType == Boolean[].class) {
String[] values = (String[]) obj;
Boolean[] ret = new Boolean[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = new Boolean(values[i]);
}
return ret;
}
if (toType == byte[].class) {
String[] values = (String[]) obj;
byte[] ret = new byte[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = new Byte(values[i]).byteValue();
}
return ret;
}
if (toType == Byte[].class) {
String[] values = (String[]) obj;
Byte[] ret = new Byte[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = new Byte(values[i]);
}
return ret;
}
//如果是字符串则直接返回obj.toString()
if (toType == String[].class) {
{
if(obj.getClass() == java.util.Date[].class)
return SimpleStringUtil.dateArrayTOStringArray((Date[])obj);
String[] values = (String[]) obj;
return values;
}
// short[] ret = new short[values.length];
// for(int i = 0; i < values.length; i ++)
// {
// ret[i] = Short.parseShort(values[i]);
// }
// return ret;
}
/**
* 字符串向java.util.Date和java.sql.Date 类型转换
*/
if (toType == java.util.Date.class) {
String[] values = (String[]) obj;
return SimpleStringUtil.stringArrayTODateArray(values,null);
}
if (toType == java.sql.Date.class) {
String[] values = (String[]) obj;
return SimpleStringUtil.stringArrayTOSQLDateArray(values,null);
}
throw new NoSupportTypeCastException(
new StringBuilder("不支持[")
.append(type)
.append("]向[")
.append(toType)
.append("]的转换")
.toString());
}
public static void getFileFromString(String value, File outfile) throws SQLException {
byte[] bytes = value.getBytes();
getFileFromBytes(bytes,outfile) ;
}
public static void getFileFromBytes(byte[] bytes,File outfile) throws SQLException
{
FileOutputStream out = null;
java.io.ByteArrayInputStream in = null;
try {
out = new FileOutputStream(outfile);
byte v[] = (byte[]) bytes;
in = new ByteArrayInputStream(v);
byte b[] = new byte[1024];
int i = 0;
while((i = in.read(b)) > 0)
{
out.write(b,0,i);
}
out.flush();
} catch (IOException e) {
throw new NestedSQLException(e);
} finally {
try
{
if (out != null) {
out.close();
out = null;
}
}
catch(Exception e)
{
}
try
{
if (in != null) {
in.close();
in = null;
}
}
catch(Exception e)
{
}
}
}
public static void getFileFromClob(Clob value,File outfile) throws SQLException
{
Writer out = null;
Reader stream = null;
try {
out = new FileWriter(outfile);
Clob clob = (Clob)value;
stream = clob.getCharacterStream();
char[] buf = new char[1024];
int i = 0;
while((i = stream.read(buf)) > 0)
{
out.write(buf,0,i);
}
out.flush();
}
catch(IOException e)
{
throw new NestedSQLException(e);
}
finally
{
try
{
if(stream != null)
stream.close();
}
catch(Exception e)
{
}
try
{
if(out != null)
out.close();
}
catch(Exception e)
{
}
}
}
public static void getFileFromBlob(Blob value,File outfile) throws SQLException
{
FileOutputStream out = null;
InputStream in = null;
try {
out = new FileOutputStream(outfile);
Blob blob = (Blob) value;
byte v[] = new byte[1024];
in = blob.getBinaryStream();
int i = 0;
while ((i = in.read(v)) > 0) {
out.write(v,0,i);
}
out.flush();
} catch (IOException e) {
throw new NestedSQLException(e);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
in = null;
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out = null;
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy