package org.neframework.jpa.util;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.neframework.jpa.annotation.Id;
import org.neframework.jpa.annotation.NotMap;
import org.neframework.jpa.annotation.Table;
import org.neframework.jpa.model.DbModel;
public class ClassTools {
/**
* 设置BEAN属性值
*
* @param field
* @param obj
* @param val
*/
public static void setClassVal(Field field, Object obj, Object val) {
boolean acc = field.isAccessible();
field.setAccessible(true);
try {
field.set(obj, val);
} catch (Exception e) {
e.printStackTrace();
} finally {
field.setAccessible(acc);
}
}
/**
* 获取属性值
*
* @param field
* @param obj
* @return
*/
public static Object getClassVal(Field field, Object obj) {
boolean acc = field.isAccessible();
field.setAccessible(true);
try {
return field.get(obj);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
field.setAccessible(acc);
}
}
/**
* 获取Class的属性名称
*
* @param clazz
* @return
*/
public static List<String> getClassProperties(Class<?> clazz) {
List<String> list = new ArrayList<String>();
List<Field> fields = getClassFields(clazz);
for (Field field : fields) {
if (field.isAnnotationPresent(NotMap.class)) {
continue;
}
list.add(field.getName());
}
return list;
}
public static List<Field> getClassFields(Class<?> clazz) {
List<Field> clazzField = new ArrayList<Field>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(NotMap.class)) {
continue;
}
clazzField.add(field);
}// #for
return clazzField;
}
/**
* 获取 id 字段
*
* @param clazz
* @return
*/
public static Field getIdField(Class<?> clazz) {
Field id = null;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(Id.class)) {
id = field;
break;
}
}// #for
if (id == null) {// 如果没有主键映射,则默认返回第一个非NotMap的字段
for (Field field : fields) {
if (!field.isAnnotationPresent(NotMap.class)) {
id = field;
break;
}
}// #for
}
return id;
}// #getIdField
/**
* 获取 created 字段
*
* @param clazz
* @return
*/
public static Field getCreatedField(Class<?> clazz) {
Field createdField = null;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.getName().equals("created")) {
createdField = field;
break;
}
}// #for
return createdField;
}// #getIdField
public static DbModel trunMapToObj(Map<String, Object> map, Class<?> clazz) {
DbModel obj = null;
if (map == null || map.isEmpty()) {
return obj;
}
try {
obj = (DbModel) clazz.newInstance();
List<Field> fields = ClassTools.getClassFields(clazz);
for (Field field : fields) {
Object val = map.get(field.getName());
ClassTools.setClassVal(field, obj, val);
}
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
/**
* 获取Class对应的table名称,如果和表不匹配可是使用@Table注解来设置
*
* @param clazz
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static String getTableName(Class clazz) {
if (!clazz.isAnnotationPresent(Table.class)) {
return clazz.getSimpleName().toString();
} else if ("".equals(((Table) clazz.getAnnotation(Table.class))
.TableName().toString())) {
return clazz.getSimpleName().toString();
} else
return ((Table) clazz.getAnnotation(Table.class)).TableName()
.toString();
}
}