跳至主要內容

反射

chanchaw大约 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)