欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

反射动态获取类并动态调用类的方法

程序员文章站 2022-07-07 13:37:21
...

最近接到一个需求 需要根据mysql配置的bean信息和方法信息 调用具体代码业务
类似dubbo 的invoke

invoke com.bestpay.test.public({"class":"com.bestpay.dto.testDto","requestData":""})

由请求参数来 确定请求的类 方法 入参
 

方式一

在这里最初想要直接使用反射的方式处理 如下

try {
    /**通过Spring容器获得的bean 没有注入相关依赖bean*/
    Object bean = applicationContext.getBean("hello");
    Class<?> mClass = bean.getClass();
    //请求方法
    Method method = mClass.getMethod("hello");
    //数据
    o = method.invoke(mClass.newInstance());
} catch (Exception e) {
    System.err.println("异常");
}

反射动态获取类并动态调用类的方法

通关容器拿到bean 是有进行自动装配的 但是在 Class<?> mClass = bean.getClass();

这一步自动装配的对象被置为空 业务存在调用其他实现的时候就需要在写一个方法来重复装配下这样代码比较丑

而且也容易被遗忘掉

方式一存在的问题是 Class<?> mClass = bean.getClass(); 这一步需要重新装配
好处是类的调用方法比较随意 支持灵活配置

 

方式二

try {
    /**通过Spring容器获得的bean 没有注入相关依赖bean*/
    hello bean = (hello) applicationContext.getBean("hello");
    return  bean.hello();
} catch (Exception e) {
    System.err.println("异常");
}

这里在容器中获取到bean后直接强制转换成具体业务类调用固定的方法
这里具体的业务类可以继承一个通用的抽象类 利用多态这种处理
抽象类父类 bean = (抽象类父类) applicationContext.getBean("hello");

抽象类父类.抽象类方法();

子类继承父类 重写父类的方法 实现具体的业务调用

方式二是直接在项目结构层面增加 统一入口的业务中转处理层

缺点就是转发的代码会比较多每增加 一个新的业务方法 就要写一个子类

 

业务是解决了 但是感觉这个方式还是不太完美 哪位大神有思路可以评论分享下

相关标签: 参考文档