背景:
因为项目controller层入参Req 和service 层DTO 入参,是两个类。需要在controller层将api接收到的参数向下传递到service层,参数名基本都是一致的。但是有时req会新增参数,类,方法过多时,确保一致就要去一一的看。比较麻烦。就想通过反射获取controller req的入参。再获取setvice层方法的入参。因为controller层的方法和service的方法名都是对应的,入参除了类名不一样,属性名都是一一对应的。
参考资料:
狂神说java 反射。主要是P15获取泛型信息。因为入参都是泛型
卡点:
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
获取入参泛型,之后是一个全类名,点class时 获取不到想要的fields,需要通
Class.forName(classNamePath);
获取类的class文件。
目前是获取了入参类型的属性值,和返回值类型的属性值, 剩下再获取service层对应方法的入参和返回值,做比较就行了。
Model
package cn.silence.model;import java.util.ArrayList;
import java.util.List;/*** @author silence* createTime 2021-12-25-12:52*/
public class Person {private String userName;private String password;public List<Person> method(List<Person> persons) {return new ArrayList<>(persons);}}
ReflectionReqTest
package cn.silence.reflection;import cn.silence.model.Person;
import org.apache.commons.lang3.StringUtils;import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;/*** @author silence* createTime 2021-12-25-11:33*/
public class ReflectionReqTest {public static void main(String[] args) throws NoSuchMethodException, ClassNotFoundException {Method method = Person.class.getMethod("method", List.class);Type[] genericParameterTypes = method.getGenericParameterTypes();for (Type genericParameterType : genericParameterTypes) {//获取泛型参数if (genericParameterType instanceof ParameterizedType) {//获取泛型里面的实际参数类型Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {//获取非String类型的类if (!StringUtils.equals("java.lang.String", actualTypeArgument.getTypeName())) {//获取参数全类名String classNamePath = actualTypeArgument.getTypeName();//根据类路径获取class文件Class<?> aClass = Class.forName(classNamePath);//获得所有属性Arrays.stream(aClass.getDeclaredFields()).forEach(System.out::println);}}}}}}
ReflectionReturnTest
package cn.silence.reflection;import cn.silence.model.Person;
import org.apache.commons.lang3.StringUtils;import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;/*** @author silence* createTime 2021-12-25-12:53*/
public class ReflectionReturnTest {public static void main(String[] args) throws NoSuchMethodException, ClassNotFoundException {Class<Person> aClass = Person.class;Method method = aClass.getDeclaredMethod("method", List.class);Type genericReturnType = method.getGenericReturnType();Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();Type actualTypeArgument = actualTypeArguments[0];if (!StringUtils.equals("java.lang.String", actualTypeArgument.getTypeName())) {//获取参数全类名String classNamePath = actualTypeArgument.getTypeName();//根据类路径获取class文件Class<?> returnClass = Class.forName(classNamePath);//获得所有属性Arrays.stream(returnClass.getDeclaredFields()).forEach(System.out::println);}}
}