java通過反射獲取類名、屬性名稱以及@Table註解上的表名稱
阿新 • • 發佈:2019-01-26
import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.Table; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * @author caizw * @createDate 2018/2/8 * @description 反射工具類 */ public class ReflectUtils { /** * 獲取實體類主鍵 * * @param clazz * @return */ public static Field getIdField(Class<?> clazz) { Field[] fields = clazz.getDeclaredFields(); Field item = null; for (Field field : fields) { Id id = field.getAnnotation(Id.class); if (id != null) { field.setAccessible(true); item = field; break; } } if (item == null) { Class<?> superclass = clazz.getSuperclass(); if (superclass != null) { item = getIdField(superclass); } } return item; } /** * 根據主鍵名稱獲取實體類主鍵屬性值 * * @param clazz * @param pkName * @return */ public static Object getPkValueByName(Object clazz, String pkName) { try { String firstLetter = pkName.substring(0, 1).toUpperCase(); String getter = "get" + firstLetter + pkName.substring(1); Method method = clazz.getClass().getMethod(getter, new Class[]{}); Object value = method.invoke(clazz, new Object[]{}); return value; } catch (Exception e) { return null; } } /** * 通過反射將 class1不為空的值賦值給class2 * * @param class1 * @param class2 * @throws Exception */ public static void reflectClass1ToClass2(Object class1, Object class2) throws Exception { Field[] field = class1.getClass().getDeclaredFields(); for (int i = 0; i < field.length; i++) { String name = field[i].getName(); if ("serialVersionUID".equals(name)) { continue; } name = name.substring(0, 1).toUpperCase() + name.substring(1); Method m1 = class1.getClass().getMethod("get" + name); Object value = m1.invoke(class1); if (value != null) { Field f = field[i]; f.setAccessible(true); f.set(class2, value); } } } /** * 獲取實體類 @Column 的其中一個屬性名稱 * * @param clazz * @return */ public static Map<String, String> getColumnName(Class<?> clazz) { Map<String, String> map = new ConcurrentHashMap<>(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { /** * 獲取欄位名 */ Column declaredAnnotation = field.getDeclaredAnnotation(Column.class); String column = declaredAnnotation.name(); map.put("fieldNames", field.getName()); map.put("column", column); break; } } return map; } /** * 通過獲取類上的@Table註解獲取表名稱 * * @param clazz * @return */ public static Map<String, String> getTableName(Class<?> clazz) { Map<String, String> map = new ConcurrentHashMap<>(); Table annotation = clazz.getAnnotation(Table.class); String name = annotation.name(); String className = clazz.getSimpleName(); map.put("tableName", name); map.put("className", className); return map; } }