java反射的应用实践

java反射之前接触比较多,但仅技术方面思考的多;这次主要是从业务角度出发,思考java反射在业务模块设计中如何发挥更高效的作用,以提高生产率

1.业务需求

要处理银行回单票据,提取出付款人、收款人及对应银行和业务信息,每个银行的格式都不统一。所以需要对各家银行的格式进行预处理,规整为标准格式后,交由后续模块处理。

这个预处理格式化的设计有多种

2.方案选型

做法 适用场景 技能要求
在if..else中添加分支逻辑 适用于分支较少的场景,如只有2~4个 简单
把分支逻辑提取为句柄,显示注册到句柄map或list中 实用于分支较多场景,但变化不大;否则若经常变动,注册时容易漏掉 需要有一定的业务抽象和接口设计能力
把分支逻辑提取为句柄,通过反射自动注册到map或list中 实用于分支较多场景,也满足经常变动场景 抽象能力+java反射技术
注册到list? 分支判断逻辑复杂,只能采用低效的遍历判断
还是注册到map? 分支判断逻辑清晰,特别是存在关键词区分

3.采用反射的技术方案

我们这个场景的特点:

  • 分支判断逻辑非常清晰,就是根据每家银行的回单类型进行分支判断。
  • 并且不断有新类型会增加进来。

所以采用下面做法

3.1.抽象Formater接口,通过Map管理所有接口

    public static HashMap<String,Formater> formaterMap = new HashMap<String,Formater>();

    public interface Formater {
        void format(Resource resource);
    }

3.2.通过java反射自动注册

    static {
        Reflections reflections = new Reflections("prepare");//包名,可以降低搜索范围

        Set<Class<? extends Formater>> subTypes = reflections
                .getSubTypesOf(Formater.class);
        for (Class<? extends Formater> clazz : subTypes) {
            String typeName = clazz.getTypeName();
            int idx = typeName.lastIndexOf("$");//内部类场景
            int idx1 = typeName.lastIndexOf(".");
            if(idx<idx1)idx = idx1;
            String className = typeName.substring(idx+1);//提取类名,作为主键

            try {
                formaterMap.put(className, clazz.newInstance());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

3.3.应用模块调用简洁

//对银行回单进行预处理
Formater formater = PrepareModule.formaterMap.get(resource.getResourceType());
if(formater != null)
    formater.format(resource);

//do next....

3.4.扩展分支简单且不会出错

以后扩展也比较简单,只需要增加新的方法实现类即可,不必担心漏掉注册的问题。

    static public class ChinaBankReceiptFormater implements Formater {
        @Override
        public void format(Resource resource) {
            //TODO
        }
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 19:25:38

java反射的应用实践的相关文章

java反射--Field用法实践

Field是一个位于java.lang.reflect包下的类,用来描述类的属性信息,功能主要包括: 获取哦大年对象的成员变量类型 对成员变量重新设值 Field类对象: Class.getFields(): 获取类中public类型的属性,返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段getDeclaredFields(): 获取类中所有的属性(public.protected.default.private),但不包括继承的属性,

Java反射实现原理分析

一.反射的用法 1.如何获取Class反射类 (1)通过getClass方法: Proxy proxy = new ProxyImpl(); Class proxyClazz = proxy.getClass(); (2)通过Class.forName方法 Proxy proxy = new ProxyImpl(); Class proxyClazz = Class.forName("com.dh.yjt.SpringBootDemo.test.Reflect.Proxy"); (3)

JAVA反射实践

Java反射机制在我的理解当中就是下面几点: 1. 对一个给定的类名(以字符串形式提供)能动态构建一个对象实例 2. 对于任意一个类,都能够知道这个类的所有属性和方法 3. 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制,这种反射机制在Java当中给我们带来了极大的方便,被大量地应用于JavaBean中 在Java的反射中我们主要用到以下几个类,下面将逐个说明 java.lang.Class; java.lang.r

java反射基础知识(五)反射应用实践

详解Java反射各种应用 Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息.通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容: Class对象 构造器 变量 方法 私有变量与私有方法 注解 泛型 数组 本文也将从上面几个方面来介绍Java反射.本文涉及的所有代码均在反射代码首先放出一个Java类作为反射的研究对象,类的内容如下: public abstract class FatherObject implements Runnab

java 反射 详解

本文来自:blog.csdn.net/ljphhj JAVA反射机制:   通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没用,下面我们看看实践 Demo - Demo: package cn.lee.demo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import

Java编程最差实践常见问题详细说明(2)转

Java编程最差实践常见问题详细说明(2)转 2012-12-13 13:57:20|  分类: JAVA |  标签:java  |举报|字号 订阅 反射使用不当  错误的写法: Java代码   Class beanClass = ... if (beanClass.newInstance() instanceof TestBean) ... 这里的本意是检查beanClass是否是TestBean或是其子类, 但是创建一个类实例可能没那么简单, 首先实例化一个对象会带来一定的消耗, 另外有

Java反射学习总结

广州疯狂软件教育Java培训,iOS培训分享Class类是Reflection API中核心的类,他位于java.lang.Class列出一些常用的方法.- getName() : 获得类的完整名字- getFields() : 获得类的public类型的属性- getDeclaredFields() : 获得类的所有属性- getMethods() : 获得类的public类型的方法- getDeclaredMethods() : 获得类的所有方法- getMethod(String name

java 反射(reflect)总结,附对象打印工具类

java反射机制认知 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类的信息以及动态调用对象的方法的功能称为java语言的反射机制Reflection. 这就说明:Java程序可以加载一个编译期间完全未知的class,获悉其完整构造,并生成其对象实体.或对其fields设值.或唤起其methods.虽然java并不是动态语言. 如何达到上述目的,是本文探讨的内容.本文将介绍Reflection A

一文带你了解Java反射机制

想要获取更多文章可以访问我的博客?-?代码无止境. 上周上班的时候解决一个需求,需要将一批数据导出到Excel.本来公司的中间件组已经封装好了使用POI生成Excel的工具方法,但是无奈产品的需求里面有个合并单元格的要求,工具类中找了半天也没发现适用的方法,就只能自己撸起袖子干了.导出Excel的工具方法会少不了使用反射,但是反射这东西对于我这种写业务代码的人来说接触比较少,所以就恶补了一下,写下这篇文章记录一下. 什么是反射 万物究其根,研究一样新东西,首先我们需要了解它是什么,干什么用的.在