背景:

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

java反射基本使用,反射泛型参数类型获取相关推荐

  1. JAVA一种获得泛型类泛型参数Class对象的方法

    我在最近的开发中遇到这样一种情形,就是有一个类需要使用泛型进行实现,但是又同时需要用到泛型的Class对象.然而由于Java泛型擦除没办法直接得到泛型参数的Class对象.本已打算放弃,但是在编写其它 ...

  2. java 泛型参数的类型_Java获得泛型参数类型

    在Android开发中,使用Gson将json字符串转换为Java对象尤为常见.在这个转换过程中,通常会结合泛型参数.接口或者抽象类来封装处理. T t = new Gson().fromJson(r ...

  3. ParameterizedType获取java泛型参数类型

    这两天在看以前写的ssh项目时,遇到一个问题就是封装的BaseDaoImpl抽象类,构造方法里面是这样写的 Class<T> clazz;public BaseDaoImpl(){Para ...

  4. Java反射--获取类方法的泛型返回或泛型参数

    Java反射--获取类方法的泛型返回或泛型参数 一.测试类 public class Test02 {public void parameterTest(Map<Integer, Dog> ...

  5. java 泛型反射_Java使用反射来获取泛型信息示例

    本文实例讲述了Java使用反射来获取泛型信息.分享给大家供大家参考,具体如下: 一 点睛 获得了Field对象后,就可以很容易地获得该Field的数据类型,即使用如下代码即可获得指定Field的类型: ...

  6. Java高质量代码之 — 泛型与反射

    在Java5后推出了泛型,使我们在编译期间操作集合或类时更加的安全,更方便代码的阅读,而让身为编译性语言的Java提供动态性的反射技术,更是在框架开发中大行其道,从而让Java活起来,下面看一下在使用 ...

  7. android 无线接口 泛收,Android下的Java之interface接口泛型 动态获取泛型的类型

    Android的泛型有多坑? 先来看看该问题的场景 将String转换成具体对象时,需要进行的关键点就是获取到对象的类型 // 这里定义了一个泛型R,那运行时如何获取到这个类型呢? // 第一眼看上去 ...

  8. Java中注解与反射的使用方法及场景,强行解释一波!

    作者:BudingCode blog.csdn.net/m0_55221239/article/details/115025182 注解 注解定义 Java 注解(Annotation)又称 Java ...

  9. java j_Javaj基础之反射

    反射概述 问题:我们平时书写在idea中的Java程序是如何运行的呢? 1)首先将 .java 源文件编译为class类文件: 2)编译后的类文件是存在硬盘中的,那么我们运行需要在内存中看到效果,那么 ...

最新文章

  1. 微众WeCross 跨链平台(2)网络拓扑
  2. ASP.NET开发要抛弃ASP旧习和破烂
  3. 没想到单位的bt下载的速度可以到这么快,满意了
  4. 如何在anaconda环境下安装tensorflow/pytorch/keras等
  5. java iterable_太糟糕了,Java 8没有Iterable.stream()
  6. 【汉化】DevExpress插件中RichEdit控件的自定义汉化方法
  7. android生命周期_Android片段生命周期
  8. leetcode 877 stone game
  9. MXF Operational Pattern 1a (OP1a)
  10. 托福百日冲刺—词汇(14)
  11. 一年中最后一个月的最后一天说说_一年最后一天的说说
  12. DeepSpeech语音转文本合成技术
  13. Idea21.1.3版本中Scala默认设置带类型
  14. 单片机万年历阴阳历c语言,单片机阴历阳历c算法万年历.pdf
  15. 开学季·DGUT立Flag =W=
  16. 【erlang】【rebar依赖】添加eredis依赖
  17. css动画--使用图标进行顺时针与逆时针转圈
  18. 数据中台-让数据用起来-第一章笔记
  19. 矩阵的负二分之一怎么计算
  20. PAT - L2-011. 玩转二叉树(分冶)

热门文章

  1. 幻世机器人_2014年科幻动作《幻世追踪/启动机械码》BD中英双字幕
  2. python背景怎么自定义铃声_Python 上课铃声的定时播放(具有较强的自我管理能力.jpg)...
  3. pin controller driver代码分析
  4. mybatis的mysql参数传递参数_mybatis 传递参数的方法总结
  5. synchronized原理_synchronized 关键字底层原理
  6. java aqs源码_java中AQS源码分析
  7. 替换元素_80%的前端会答错的问题:lt;imggt;是什么元素?
  8. 神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(Anaconda软件使用)
  9. 数据结构与算法(C#版)第二章 C#语言与面向对象技术(下)V1.0
  10. 【转】GigE Vision简介