com.tlgen.orm.utils.ReflectUtils Maven / Gradle / Ivy
The newest version!
package com.tlgen.orm.utils;
import com.tlgen.orm.function.TypeFunction;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 反射工具类
*/
public class ReflectUtils {
/**
* 获取已有对象的属性值
*
* @param obj
* @param fieldName
* @return
*/
public static Object getFieldValue(Object obj, String fieldName) {
// 1.根据属性名称就可以获取其get方法
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
// get 方法都是 public 的且无参数
Method m= obj.getClass().getMethod(getMethodName);
//3 通过方法的反射操作方法
Object value = m.invoke(obj);
return value;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根据对象的属性名获取其属性值
* @param clazz
* @param fieldName
* @return
*/
public static String getFieldValue(Class clazz, String fieldName) {
// 1.根据属性名称就可以获取其get方法
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
Object obj = null;
try {
Class> aClass = Class.forName(clazz.getName());
try {
obj = aClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
// get 方法都是 public 的且无参数
Method m= clazz.getMethod(getMethodName);
//3 通过方法的反射操作方法
Object value = m.invoke(obj);
return String.valueOf(value);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根据类型和属性名创建 Field 对象
* @param clazz
* @param fieldName
* @return
*/
public static Field getFiledInstance(Class clazz, String fieldName) {
try {
Field field = clazz.getDeclaredField(fieldName);
return field;
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return null;
}
/**
* 根据类型获取类的名称
* @param clazz
* @return
*/
public static String getClassName(Class clazz) {
String name = clazz.getName();
String[] strings = name.split("\\.");
return strings[strings.length - 1];
}
/**
* 将 bean 的属性的 get 方法, 作为 lambda 表达式传入时, 获取 get 方法对应的属性 Field
*
* @param fn lambda 表达式, bean 的属性的 get 方法
* @param 泛型
* @return 属性对象
*/
public static String getLambdaFieldName(TypeFunction fn) {
// 从function取出序列化方法
Method writeReplaceMethod;
try {
writeReplaceMethod = fn.getClass().getDeclaredMethod("writeReplace");
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
// 从序列化方法取出序列化的lambda信息
boolean isAccessible = writeReplaceMethod.isAccessible();
writeReplaceMethod.setAccessible(true);
SerializedLambda serializedLambda;
try {
serializedLambda = (SerializedLambda) writeReplaceMethod.invoke(fn);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
writeReplaceMethod.setAccessible(isAccessible);
// 从lambda信息取出method、field、class等
String implMethodName = serializedLambda.getImplMethodName();
// 确保方法是符合规范的get方法,boolean类型是is开头
if (!implMethodName.startsWith("is") && !implMethodName.startsWith("get")) {
throw new RuntimeException("get 方法名称: " + implMethodName + ", 不符合 java bean 规范");
}
// get方法开头为 is 或者 get,将方法名 去除is或者get,然后首字母小写,就是属性名
int prefixLen = implMethodName.startsWith("is") ? 2 : 3;
String fieldName = implMethodName.substring(prefixLen);
String firstChar = fieldName.substring(0, 1);
fieldName = fieldName.replaceFirst(firstChar, firstChar.toLowerCase());
Field field;
try {
field = Class.forName(serializedLambda.getImplClass().replace("/", ".")).getDeclaredField(fieldName);
} catch (ClassNotFoundException | NoSuchFieldException e) {
throw new RuntimeException(e);
}
return field.getName();
}
}