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

这篇博客探讨了在Java项目中,如何利用反射来处理Controller层和服务层方法参数的一致性问题。作者通过反射获取Controller方法的泛型参数,并进一步获取其属性,旨在减少手动检查的工作量。示例代码展示了如何获取并比较入参类型和返回值类型的属性。
摘要由CSDN通过智能技术生成

背景:

因为项目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);
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silence丶你的名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值