背景:
因为项目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);
}
}
}
版权声明:本文为qq_42553504原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。