6 changed files with 116 additions and 10 deletions
			
			
		- 
					5archives/src/main/java/com/storeroom/modules/dictionary/controller/ArchivesTypeController.java
- 
					2archives/src/main/java/com/storeroom/modules/dictionary/domain/ArchivesType.java
- 
					2archives/src/main/java/com/storeroom/modules/dictionary/service/dto/ArchivesTypeDTO.java
- 
					3archives/src/main/java/com/storeroom/modules/dictionary/service/impl/DynamicTableImpl.java
- 
					2common/src/main/java/com/storeroom/utils/ApiResponse.java
- 
					104common/src/main/java/com/storeroom/utils/ReflectUtils.java
| @ -0,0 +1,104 @@ | |||||
|  | package com.storeroom.utils; | ||||
|  | 
 | ||||
|  | import java.lang.reflect.Constructor; | ||||
|  | import java.lang.reflect.Field; | ||||
|  | import java.lang.reflect.Method; | ||||
|  | 
 | ||||
|  | /** | ||||
|  |  * 反射工具类 | ||||
|  |  */ | ||||
|  | public class ReflectUtils { | ||||
|  |     /** | ||||
|  |      * 定义静态工具方法,使用反射创建对象 | ||||
|  |      * 步骤: | ||||
|  |      * 1 调用Class.forName(className)方法,获取Class对象。反射入口 | ||||
|  |      * 2 调用Class的getDeclaredConstructor方法获取构造器 | ||||
|  |      * 3 调用构造器的newInstance方法创建对象 | ||||
|  |      * @param className 以字符串表示的类名称,通常是包名+类名 | ||||
|  |      * @param <T> 该方法支持泛型 | ||||
|  |      * @return 泛型(不确定的类型) | ||||
|  |      */ | ||||
|  |     public static <T> T createObject(String className) throws Exception { | ||||
|  |         Class<?> clazz = Class.forName(className); | ||||
|  |         Constructor<?> structor = clazz.getDeclaredConstructor(); | ||||
|  |         return (T)structor.newInstance(); | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     /** | ||||
|  |      * 使用反射创建带有参数对象 | ||||
|  |      * @param className 以字符串表示的类名称,通常是包名+类名 | ||||
|  |      * @param params 参数类型列表 | ||||
|  |      * @param values 参数实际值列表 | ||||
|  |      * @param <T> 方法支持泛型 | ||||
|  |      * @return 返回结果是泛型(不确定的类型) | ||||
|  |      */ | ||||
|  |     public static <T> T createObject(String className,Class<?>[] params,Object... values) throws Exception{ | ||||
|  |         Class<?> clazz = Class.forName(className); | ||||
|  |         Constructor<?> struct = clazz.getDeclaredConstructor(params); | ||||
|  |         return (T)struct.newInstance(values); | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     /** | ||||
|  |      * | ||||
|  |      * 使用反射完成方法调用(无参) | ||||
|  |      * 步骤: | ||||
|  |      * 1 根据方法名称获取方法签名(信息) | ||||
|  |      * 2 使用反射调用方法 | ||||
|  |      * @param  type 对象的实例 | ||||
|  |      * @param  methodName 方法名称 | ||||
|  |      * 备注:该方法支持两个泛型 | ||||
|  |      *  T 参数是一个泛型类型 | ||||
|  |      *  R 返回值是一个泛型 | ||||
|  |      */ | ||||
|  |     public static <T,R>  R invokeMethod(T type,String methodName) throws Exception { | ||||
|  |         Class<?> clazz = type.getClass(); | ||||
|  |         // 根据方法名称获取方法签名 | ||||
|  |         Method method = clazz.getDeclaredMethod(methodName); | ||||
|  |         return (R)method.invoke(type); | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     /** | ||||
|  |      * 使用反射调用带有参数的方法 | ||||
|  |      * 步骤: | ||||
|  |      * 1 获取Class对象 | ||||
|  |      * 2 根据方法名称获取方法签名 | ||||
|  |      * 3 调用Method的invoke方法,完成方法调用,并填写参数类型和参数名称 | ||||
|  |      * 4 返回方法调用的结果 | ||||
|  |      * @param obj 反射创建的对象 | ||||
|  |      * @param methodName 方法名称 | ||||
|  |      * @param params 参数类型列表 | ||||
|  |      * @param value 参数值列表 | ||||
|  |      * @param <T> 参数支持泛型 | ||||
|  |      * @param <R> 返回值支持泛型 | ||||
|  |      * @return 返回方法调用的结果 | ||||
|  |      */ | ||||
|  |     public static <T,R> R invokeMethod(T obj,String methodName,Class[] params,Object...value) throws Exception{ | ||||
|  |         Class<?> clazz = obj.getClass(); | ||||
|  |         Method method = clazz.getDeclaredMethod(methodName, params); | ||||
|  |         // 编译错误:invoke方法返回Object类型,但是我定义的方法返回R,需要将返回类型强制转换为R类型 | ||||
|  |         // return method.invoke(type,value); | ||||
|  |         return (R) method.invoke(obj,value); | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     /** | ||||
|  |      * 使用反射访问私有属性(暴力破解) | ||||
|  |      * 步骤: | ||||
|  |      * 1 获取Class对象 | ||||
|  |      * 2 根据属性名称获取属性签名Field | ||||
|  |      * 3 设置属性签名的可访问性为true | ||||
|  |      * 4 调用set方法访问私有属性(为私有属性赋值) | ||||
|  |      * @param obj 对象 | ||||
|  |      * @param fieldName 属性名称 | ||||
|  |      * @param value 属性值 | ||||
|  |      * @param <T> 参数支持泛型,此时表示参数类型不确定 | ||||
|  |      * @throws Exception | ||||
|  |      */ | ||||
|  |     public static <T> void accessField(T obj,String fieldName,String value) throws Exception { | ||||
|  |         Class<?> clazz = obj.getClass(); | ||||
|  |         Field stuNameField = clazz.getDeclaredField(fieldName); | ||||
|  |         // 设置属性可访问性为true,就能够访问私有属性 | ||||
|  |         stuNameField.setAccessible(true); | ||||
|  |         // 为私有属性赋值 | ||||
|  |         stuNameField.set(obj,value); | ||||
|  |     } | ||||
|  | } | ||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue