首页 > 编程语言 >java如何利用反射实现方法共用?条件:相同的业务逻辑但实体类不同(要求:其使用的方法属性在实体中均含有)

java如何利用反射实现方法共用?条件:相同的业务逻辑但实体类不同(要求:其使用的方法属性在实体中均含有)

时间:2023-05-13 22:25:07浏览次数:37  
标签:中均 实体类 java List getId clazz obj customList 方法

一、情景: 在项目开发中经常遇到在两个不同的地方要处理相同逻辑的数据处理,但所使用的实体确是两个实体,且没有继承关系,这样简单的使用泛型就无法实现方法共用,

但这样重复的代码在项目中存在实在不是一个优雅的方案,故随着技术水平的提高,不断的研究,终于找到了能解决的方案,故此记录。

本人技术有限,如果有了更好的解决方案,还会继续整理。

二、思路:方法参数有两个,所要处理的数据对象,以及类,之后通过反射获取类中的方法,再根据方法对所传的数据对象进行数据处理,方法定义如下:

public <T> List<T> customList(Object obj, Class<T> clazz){

List<T> = new ArrayList();

Method getId = clazz.getDeclaredMethod("getId"); // get方法
Method setId = new PropertyDescriptor("id", clazz).getWriteMethod(); // set方法
// Method getId = new PropertyDescriptor("id", clazz).getReadMethod(); // 这种方式同样可以获取get方法,但getDeclaredMethod方式对set方式测试没通过
// 判断数据类型
if (obj instanceof List<?>) {
  for (Object o : (List<?>) obj) {
      if ((String)getId .invoke(o) == "") {
          setId .invoke(o, "这是你要的值");
      }
     result.add(clazz.cast(o));
  }
}
  return result;

}

调用如下:分为两种不同实体

List<Demo> demolist= demoService.customList(demolist, Demo.class);
List<Test> testlist= demoService.customList(testlist, Test.class);

三、拓展:若一个方法传两个参数觉得麻烦或者可能存在类型对应不上的问题,可参考以下:

public <T> List<T> customList(Object obj){

  if(null != obj){

    Class<?> clazz = obj.getClass();

    // 同上

    result.add((T) o); //此方式强转未检查故需另细节处理一下

  }

 }
缺点:数据如果需要循环处理则开销会增大

标签:中均,实体类,java,List,getId,clazz,obj,customList,方法
From: https://www.cnblogs.com/dongfangzhaoyue/p/17398342.html

相关文章

  • 【♨Java基础】浅谈栈帧
    什么是栈帧栈帧是栈中的一个栈元素,是一种用于帮助虚拟机执行方法调用与方法执行的数据结构,当前线程中,每执行一个方法就会往栈中插入一个栈帧。栈帧本身是一种数据结构,封装了方法的局部变量表、动态链接信息、方法返回地址(即返回到方法的调用者)以及操作数栈。Java虚拟机栈(JavaV......
  • Window环境下Java备份和恢复Mysql数据
    ***java执行代码中必须加cmd/cProcessexec=Runtime.getRuntime().exec("cmd/cmysqldump-uroot-p123456xxl_job>e:/home/jobbak.sql");Processexec1=Runtime.getRuntime().exec("pingwww.baidu.com");BufferedReaderbufferedReader=newBuf......
  • 获取拼多多商品详情api、接口获取宝贝详情、产品详细属性Java示例说明
    ​ ​编辑拼多多是一家创新型的社交电商平台,成立于2015年,总部位于上海。它突破了传统电商的商业模式,通过社交传播与砍价团购的方式,为用户提供更便宜、更优质的商品。截至2021年第一季度,拼多多用户数量已经超过8亿,是中国最受欢迎的电商平台之一。pinduoduo.item_get根据ID取商......
  • java-异常机制
    异常机制什么是异常Exception异常发生在程序运行期间,影响正常程序执行流程异常体系结构java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类这些异常分为两大类,错误Error和异常Exception ErrorError类对象由java虚拟机生成并抛出,大多数错......
  • java的深拷贝和浅拷贝
    Java将内存空间分为堆和栈。基本类型直接在栈中存储数值,而引用类型是将引用放在栈中,实际存储的值是放在堆中,通过栈中的引用指向堆中存放的数据。转载:https://juejin.cn/post/6977210221542408199#comment......
  • Java 垃圾回收
    回收区域:java堆对象划分:新生代内存(YoungGeneration)老生代(OldGeneration)永久代(PermanentGeneration)永久代和原空间的区别在于元空间在直接内存上。堆的结构如上图所示。Eden,s0,s1为新生代,Tenured为老年代,最底下是永久代。内存分配规则一般新对象会分配到......
  • Java 内存模型
    java虚拟机将内存区域划分为:方法栈本地方法栈堆程序计数器方法区其中,堆和方法区是线程共有的,其他都是每个线程私有的。程序计数器用于记录指令执行位置,以便线程正常切换方法栈和本地方法栈则是执行函数时存放的临时变量(变量的引用,即便是函数中生成的对象,也是存放在堆中......
  • Java面试查漏补缺(1)
    Java面试查漏补缺(1)1.无序List查询问题如果你有一个存储了10万条无序整数数据的LinkedList,并且需要高效地查询其中一个元素,可以考虑以下两种方式:使用HashSet进行查询:将LinkedList中的所有元素逐个添加到HashSet中。HashSet是基于哈希表实现的数据结构,具有快速的查找性能......
  • Java实验
    Java实验一面向对象编程图书类点击查看代码importjava.util.Date;//java.sql.Date;importjava.text.SimpleDateFormat;interfacemanagement{voidborrow();voidrebook();}classBook{Stringname;Datedate;Stringlog;intcount;......
  • java 腾讯云、阿里云SMS短信工具类
    引入POM依赖<!--腾讯云SMSSDK--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java-sms</artifactId><version>3.1.754</version&g......