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

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

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

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

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

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); //此方式强转未检查故需另细节处理一下

  }

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

posted @ 2023-05-13 22:07  华了个华  阅读(465)  评论(0)    收藏  举报