java反射基本使用,反射泛型参数类型获取

  • Post author:
  • Post category:java


背景:

因为项目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 版权协议,转载请附上原文出处链接和本声明。