反射
大约 1 分钟languagejava
属性数据类型
泛型参数通过方法 getClass 获取实际的对象类型后获取指定名称属性的数据类型,通过下面方法可得知属性是 String 或者 Integer
public static <T> T setCreateUser(T record, OpeEnum opeEnum)
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException, ClassNotFoundException {
String attrName = "";
String methodName = "";
String attrType = "";
if(opeEnum == OpeEnum.NEW) {
attrName = SystemConfig.ATTRIBUTE_NAME_CREATE_USER;
methodName = SystemConfig.METHOD_NAME_CREATE_USER;
}
if(opeEnum == OpeEnum.UPDATE) {
attrName = SystemConfig.ATTRIBUTE_NAME_LAST_USER;
methodName = SystemConfig.METHOD_NAME_LAST_USER;
}
// 获取属性的数据类型
Class<?> clazz = record.getClass();
Field field = clazz.getDeclaredField(attrName);
Class<?> fieldType = field.getType();
attrType = fieldType.toString();
boolean isString = fieldType.equals(Class.forName("java.lang.String"));
boolean isInteger = fieldType.equals(Class.forName("java.lang.Integer"));
if(!hasField(record.getClass(), attrName) || !hasMethod(record.getClass(), methodName, new Class[]{String.class})) return record;
Method method1 = clazz.getDeclaredMethod(methodName, String.class);
method1.invoke(record, ShiroUtils.getUserPKInteger());
return record;
}
调用方法 - 泛型
下面是通过反射调用指定类型的方法
public static SysUser fullFillRecord(SysUser record) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
if(!hasField(SysUser.class,"createUser")
|| !hasMethod(SysUser.class, "setCreateUser",new Class[]{String.class})) return record;
Class<? extends SysUser> clazz = record.getClass();
Method method1 = clazz.getDeclaredMethod(SystemConfig.METHOD_NAME_CREATE_USER, String.class);
method1.invoke(record,HttpRequestUtils.getRequestUserSid());
return record;
}
下面是通过反射调用泛型类型的方法
public static <T> T fullFillRecord(T record) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
if(!hasField(record.getClass(), SystemConfig.ATTRIBUTE_NAME_CREATE_USER)
|| !hasMethod(SysUser.class, SystemConfig.METHOD_NAME_CREATE_USER, new Class[]{String.class})) return record;
Class<?> clazz = record.getClass();
Method method1 = clazz.getDeclaredMethod(SystemConfig.METHOD_NAME_CREATE_USER, String.class);
method1.invoke(record, HttpRequestUtils.getRequestUserSid());
return record;
}
检测属性、方法是否存在
import org.springframework.util.ReflectionUtils;
// 封装的方法,返回 true 表示属性存在
public static boolean hasField(Class clazz, String fieldName) {
Field field = ReflectionUtils.findField(clazz, fieldName);
if (field != null) {
return true;
}
return false;
}
// 封装的方法,返回 true 表示方法存在
public static boolean hasMethod(Class clazz, String methodName, Class[] argsType) {
Method method = ReflectionUtils.findMethod(clazz, methodName, argsType);
if (null != method) {
return true;
}
return false;
}
// 使用案例
boolean ret = hasField(SysUser.class,"createUser");
// 第三个参数表示方法 setCreateUser 参数的数据类型是 String
boolean ret = hasMethod(SysUser.class, "setCreateUser",new Class[]{String.class});
获取方法形参名称

对象是否实现某接口
if(obj instanceof TestInerface)
