package org.jcommons.common;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Date;
public class ClassUtils {
public static Class<?> getPojoClass(Method method) {
Type type = method.getGenericReturnType();
String clsName = type.toString();
if (clsName.contains("<") && clsName.contains(">")) {
int s = clsName.indexOf("<") + 1;
int e = clsName.indexOf(">");
String str = clsName.substring(s, e);
return ClassUtils.getPojoClass(str);
} else
return method.getReturnType();
}
public static Class<?> getPojoClass(String className) {
Class<?> cls;
try {
cls = Thread.currentThread().getContextClassLoader().loadClass(className);
if (isPojo(cls))
return cls;
} catch (ClassNotFoundException e) {
}
return null;
}
public static boolean isPojo(Class<?> cls) {
if (cls == null)
return false;
if (Collection.class.isAssignableFrom(cls)) {
} else {
if (Integer.class.isAssignableFrom(cls)
|| int.class.isAssignableFrom(cls)) {
} else if (Integer[].class.isAssignableFrom(cls)
|| int[].class.isAssignableFrom(cls)) {
} else if (Long.class.isAssignableFrom(cls)
|| long.class.isAssignableFrom(cls)) {
} else if (Long[].class.isAssignableFrom(cls)
|| long[].class.isAssignableFrom(cls)) {
} else if (Float.class.isAssignableFrom(cls)
|| float.class.isAssignableFrom(cls)) {
} else if (Float[].class.isAssignableFrom(cls)
|| float[].class.isAssignableFrom(cls)) {
} else if (Double.class.isAssignableFrom(cls)
|| double.class.isAssignableFrom(cls)) {
} else if (Double[].class.isAssignableFrom(cls)
|| double[].class.isAssignableFrom(cls)) {
} else if (String.class.isAssignableFrom(cls)) {
} else if (String[].class.isAssignableFrom(cls)) {
} else if (Date.class.isAssignableFrom(cls)) {
} else if (Date[].class.isAssignableFrom(cls)) {
} else {
try {
cls.newInstance();
return true;
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
}
}
return false;
}
/**
*
* @param <T>
* @param fieldName
* @param v
* @param vs
* @param pojo
* @return
* @throws Exception
*/
public static <T> T injectFieldValue(T pojo, String fieldName, String[] vs)
throws Exception {
if (pojo == null)
return null;
if (vs == null)
return pojo;
ReflectUtils ru = new ReflectUtils(pojo);
Field f = ru.getField(fieldName);
if (f == null)
return pojo;
Method setter = ru.getSetter(fieldName);
if (setter == null)
return pojo;
Class<?> clazz = f.getType();
if (Object[].class.isAssignableFrom(clazz)) {
Object obj = getParamVals(clazz, vs);
if (obj != null)
setter.invoke(pojo, new Object[] { obj });
} else {
Object obj = getParamVal(clazz, vs[0]);
if (obj != null)
setter.invoke(pojo, obj);
}
return pojo;
}
public static Object getParamVal(Class<?> fieldType, String fieldVal) {
Class<?> clazz = fieldType;
String v = fieldVal;
if (v == null)
return null;
try {
if (int.class.isAssignableFrom(clazz)
|| Integer.class.isAssignableFrom(clazz)) {
if ("".equals(v.trim()))
v = "0";
try {
return Integer.parseInt(v);
} catch (Exception e){
return 0;
}
} else if (long.class.isAssignableFrom(clazz)
|| Long.class.isAssignableFrom(clazz)) {
if ("".equals(v.trim()))
v = "0L";
try {
return Long.parseLong(v);
}catch(Exception e){
return 0L;
}
} else if (double.class.isAssignableFrom(clazz)
|| Double.class.isAssignableFrom(clazz)) {
if ("".equals(v.trim()))
v = "0.0D";
try {
return Double.parseDouble(v);
}catch(Exception e){
return 0.0D;
}
} else if (float.class.isAssignableFrom(clazz)
|| Float.class.isAssignableFrom(clazz)) {
if ("".equals(v.trim()))
v = "0.0F";
try {
return Float.parseFloat(v);
}catch(Exception e){
return 0.0F;
}
} else if (boolean.class.isAssignableFrom(clazz)
|| Boolean.class.isAssignableFrom(clazz)) {
if ("".equals(v.trim()))
v = "false";
try {
return Boolean.parseBoolean(v);
}catch(Exception e){
return false;
}
} else if (String.class.isAssignableFrom(clazz)) {
return v;
}
} catch (Exception e) {
e.printStackTrace();
} catch (Error e) {
e.printStackTrace();
}
return null;
}
public static Object getParamVals(Class<?> fieldType, String[] fieldVals) {
Class<?> clazz = fieldType;
String[] vs = fieldVals;
if (vs == null)
return null;
try {
int length = vs.length;
if (Integer[].class.isAssignableFrom(clazz)) {
Integer[] args = new Integer[length];
for (int i = 0; i < vs.length; i++) {
if ("".equals(vs[i].trim()))
vs[i] = "0";
try {
args[i] = Integer.parseInt(vs[i]);
} catch (Exception e){
args[i] = 0;
}
}
return args;
} else if (int[].class.isAssignableFrom(clazz)) {
int[] args = new int[length];
for (int i = 0; i < vs.length; i++) {
if ("".equals(vs[i].trim()))
vs[i] = "0";
try{
args[i] = Integer.parseInt(vs[i]);
} catch (Exception e){
args[i] = 0;
}
}
return args;
} else if (Long[].class.isAssignableFrom(clazz)) {
Long[] args = new Long[vs.length];
for (int i = 0; i < vs.length; i++) {
if ("".equals(vs[i].trim()))
vs[i] = "0";
try{
args[i] = Long.parseLong(vs[i]);
} catch (Exception e){
args[i] = 0L;
}
}
return args;
} else if (long[].class.isAssignableFrom(clazz)) {
long[] args = new long[vs.length];
for (int i = 0; i < vs.length; i++) {
if ("".equals(vs[i].trim()))
vs[i] = "0";
try{
args[i] = Long.parseLong(vs[i]);
} catch (Exception e){
args[i] = 0L;
}
}
return args;
} else if (Double[].class.isAssignableFrom(clazz)) {
Double[] args = new Double[vs.length];
for (int i = 0; i < vs.length; i++) {
if ("".equals(vs[i].trim()))
vs[i] = "0.0";
try{
args[i] = Double.parseDouble(vs[i]);
} catch (Exception e){
args[i] = 0.0D;
}
}
return args;
} else if (double[].class.isAssignableFrom(clazz)) {
double[] args = new double[vs.length];
for (int i = 0; i < vs.length; i++) {
if ("".equals(vs[i].trim()))
vs[i] = "0.0";
try{
args[i] = Double.parseDouble(vs[i]);
} catch (Exception e){
args[i] = 0.0D;
}
}
return args;
} else if (Float[].class.isAssignableFrom(clazz)) {
Float[] args = new Float[vs.length];
for (int i = 0; i < vs.length; i++) {
if ("".equals(vs[i].trim()))
vs[i] = "0.0";
try{
args[i] = Float.parseFloat(vs[i]);
} catch (Exception e){
args[i] = 0.0F;
}
}
return args;
} else if (float[].class.isAssignableFrom(clazz)) {
float[] args = new float[vs.length];
for (int i = 0; i < vs.length; i++) {
if ("".equals(vs[i].trim()))
vs[i] = "0.0";
try{
args[i] = Float.parseFloat(vs[i]);
} catch (Exception e){
args[i] = 0.0F;
}
}
return args;
} else if (Boolean[].class.isAssignableFrom(clazz)) {
Boolean[] args = new Boolean[vs.length];
for (int i = 0; i < vs.length; i++) {
if ("".equals(vs[i].trim()))
vs[i] = "false";
try{
args[i] = Boolean.parseBoolean(vs[i]);
} catch (Exception e){
args[i] = false;
}
}
return args;
} else if (boolean[].class.isAssignableFrom(clazz)) {
boolean[] args = new boolean[vs.length];
for (int i = 0; i < vs.length; i++) {
if ("".equals(vs[i].trim()))
vs[i] = "false";
try{
args[i] = Boolean.parseBoolean(vs[i]);
} catch (Exception e){
args[i] = false;
}
}
return args;
} else if (String[].class.isAssignableFrom(clazz)) {
return vs;
}
} catch (Exception e) {
return null;
} catch (Error e) {
return null;
}
return null;
}
public static Class<?> getGenericType(Field f){
Class<?> cls = f.getType();
if (!Collection.class.isAssignableFrom(cls))
return cls;
ParameterizedType pt = (ParameterizedType) f.getGenericType();
Type type = pt.getActualTypeArguments()[0];
Class<?> targetCls = ClassUtils.getPojoClass(type.toString().replace("class ", "").replace("interface ", "").trim());
if (targetCls == null)
return cls;
return targetCls;
}
public static boolean isListClass(Field f) {
Class<?> cls = f.getType();
if (!Collection.class.isAssignableFrom(cls))
return false;
ParameterizedType pt = (ParameterizedType) f.getGenericType();
Type type = pt.getActualTypeArguments()[0];
Class<?> targetCls = ClassUtils.getPojoClass(type.toString().replace("class ", ""));
if (targetCls == null)
return false;
return true;
}
public static boolean isListString(Field f) {
Class<?> cls = f.getType();
if (!Collection.class.isAssignableFrom(cls))
return false;
ParameterizedType pt = (ParameterizedType) f.getGenericType();
Type type = pt.getActualTypeArguments()[0];
if ("class java.lang.String".equals(type.toString()))
return true;
return false;
}
}