代码编织梦想

业务场景:

最近做一个新增接口的需求,对接第三方报文时,发现该报文内容字段中,有多种子报文类型,且都是循环报文体,每种类型都有几个关键字段是相同的,需求需要拿到每个子报文的这几个关键字段进行处理。系统解析报文时,自动将相同类型的子报文解析为List<T>集合,每个子报文解析为一个对象存储在集合中。例如:

//子报文解析得到的对象Demo1
public class Demo1{
    private String id = "001"
    private String name = "张三";
    
    public String getName(){
        return this.name;
    }
    public String getId(){
        return this.id;
    }
}
//子报文解析得到的对象Demo2
public class Demo2{
    private String sex = "M";
    private String name = "李四";
    
    public String getSex(){
        return this.sex;
    }
    public String getName(){
        return this.name;
    }
}
......
public class Test{
    public static void main(String args[]){
        //RespoBody为报文对象
        //解析得到子报文对象(Demo1)集合
        List<Demo1> demo1List = RespBody.getDemo1s();
        //解析得到子报文对象(Demo2)集合
        List<Demo2> demo2List = RespBody.getDemo2s();
        ......
    }
}

问题描述:

此处只用两个Demo类来举例,实际业务场景中有若干个这样的类(属性不完全相同)。此时要处理每个类的关键字段时(如name),就需要将每个集合中的每个对象依次取出并处理,但我们知道,由于处理的字段是相同的,只有对象不同,我们当然会想到将处理字段的逻辑代码抽取成一个方法进行调用,我们只需要将集合作为参数传入方法即可。由于每个集合中保存的对象都是不同的类,所以在传参时集合需要使用泛型。

public class Test{
    private void doData(List<?> list){
        for(Object obj : list){
            ......
        }
    }
}

可以看到,由于使用了泛型参数,这样从集合中取出的对象就自动向上转型为了Object类型,此时obj对象作为原Demo对象的父类对象,已经无法直接调用子类Demo类的getName()方法。

解决方案:

这里可以利用Java的反射机制,通过对象逆向的获取到类的信息,可以利用invoke()方法调用Demo类的方法。

public class Test{
    private void doData(List<?> list){
        for(Object obj : list){
            obj.getClass().getMethod("getName").invoke(obj);
        }
    }
}

这里可以发现,invoke()方法需要至少传入一个对象参数,作为调用前面获取到的getName()方法的主体,而此时的obj对象是Object类型的,从表面上看,相当于我们通过一个父类对象,调用了子类对象的方法。

之前一直不太清楚反射机制的实际业务用途,今天碰到这个问题,经过学习后终于对反射有了更详细具体的了解。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_50893467/article/details/129631343

java 中父类怎么调用子类的方法? 和在子类调用父类的方法super_周末去看海的博客-爱代码爱编程

父类能调用子类的方法吗? 答:能。   怎么做? ● 把子类传递到父类的有参构造中,然后调用。● 使用反射的方式调用,你使用了反射还有谁不能调用的?!● 父类调用子类的静态方法。 案例展示: [java]  view plain  copy package com.ywq;        p

java 调用父级方法_Java中父类怎么调用子类的方法-爱代码爱编程

父类能调用子类的方法吗? 答:能。 怎么做? 把子类传递到父类的有参构造中,然后调用。 使用反射的方式调用,你使用了反射还有谁不能调用的?! 父类调用子类的静态方法。 案例展示: package com.ywq; public class Test2{ public static void main(String[] args) {

java父类调用子类方法_Java 中父类怎么调用子类的方法?-爱代码爱编程

父类能调用子类的方法吗? 答:能。 怎么做? ● 把子类传递到父类的有参构造中,然后调用。 ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法。 案例展示: package com.ywq; public class Test2{ public static void main(String[] ar

java 父类调用子类_【Java面试】父类能调用子类的方法吗?-爱代码爱编程

文章开始前,我们先抛出一个链式问题: Java中父类能调用子类的方法吗? 如果不可以,原因?如果可以,如何做? 每种实现方式,在实际项目被允许吗? 不被允许的原因有哪些? 如果在实际项目中,的确有这样的特殊业务场景,应如何“正确的” - “变相”的去实现? 1.Java中父类能调用子类的方法吗? 答案:能 1.1 实现方式描述 (1)

java 子类对象赋值给父类对象吗_简析如何在JAVA语言中将子类对象赋值给父类对象...-爱代码爱编程

本文主要向大家介绍了如何在JAVA语言中将子类对象赋值给父类对象,最近对将子类对象赋值给父类对象有点心得,想和大家分享一下,希望对大家学习JAVA语言有所帮助。 言归正传,下面是几个小例子,请大家看一看. 测试一 父类:public class Supclass { public void print() { System.out.pri

java this 父类子类_java this 子类调父类,父类再调用子类已覆盖的方法及属性(又一次理解)...-爱代码爱编程

之前一直以为 this关键字 是指调用者对象,但是这次才真正理解,this代表当前对象,但是指向调用者对象,其实就是多态的用法,如下所示:B 继承了 A,在B 中调用A类的方法,在A 中用this 访问成员变量和方法,此时,如果用this访问成员变量,如下,this.s ,无论B 子类有没有 s属性,又或者s 的修饰符是 private 或者 publ

java子类对象赋值给父类对象_父类和子类转换(子类对象赋值给父类对象)(转载)...-爱代码爱编程

下面是几个小例子,请大家看一看: 测试一 父类: public class Supclass { public void print() { System.out.println("this is 父类print()方法"+"——此时对象"+this.toString()); } } 子类: public class Subcla

java如何调用父类的实例对象_java子类调用父类的方法中包含子类重写的实例方法...-爱代码爱编程

java子类调用父类的方法中包含子类重写的实例方法 # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了 # 先看代码: public class Common { public static void main(String[] args) { Sub sub = new Sub(); sub.testSub(); } } c

Java基础——继承中父类子类调用过程-爱代码爱编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、代码块父类:子类代码:测试类代码一(子类通过无参构造方法构造)执行结果:测试类代码二(子类通过有参构造方法构造)执行结果:总结 前言 本篇内容主要介绍当使用继承时,父类子类相应的调用过程 一、代码块 父类: public class Ani

如何优雅的用poi导入excel文件-爱代码爱编程

在企业级项目开发中,要经常涉及excel文件和程序之间导入导出的业务要求,那么今天来讲一讲excel文件导入的实现。java实现对excel的操作有很多种方式,例如EasyExcel等,今天我们使用的是POI技术实现excel文件的导入。 POI技术简介 1.POI概念 Apache POI 是用Java编写的免费开源的跨平台的Java AP

jvm监控搭建-爱代码爱编程

文章目录 JVM监控搭建整体架构JolokiaTelegrafInfluxdbGrafana JVM监控搭建 整体架构 JVM 的各种内存信息,会通过 JMX 接口进行暴露。 Jolokia

redisson项目地址-爱代码爱编程

github 项目 https://github.com/redisson/redisson 整合 spring boot 使用 https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter#spring-boot-starter 对应配置类以