@ReverseSuper-反向接口类辅助重构

原创 2018年04月16日 15:12:13

ReverseSuper

引用

    implementation 'com.licola:reversesuper-annotation:1.0.0'//注解库
    annotationProcessor 'com.licola:reversesuper-compiler:1.0.0'//代码生成工具库

使用

/**
 * Created by LiCola on 2018/3/15.
 * 使用示例,主要针对已经存在的类,rebuild后就可生成对应的接口类。
 * 避免需要手动编写,针对项目重构,抽象等,加快开发。
 * 其中AccountManager接口类是动态生成,它抽象目标类的public方法
 */
@ReverseSuper
public class AccountManagerImpl implements AccountManager{
    @Override
    public String reverseMethod(String input) {
      return "被反向生成抽象方法的 目标方法";
    }

    private String value = "不会被处理非方法信息-变量";

    private void privateMethod() {
    //不会被反向生成的私有方法
    }
}

ReverseSuper注解在目标类上,点击Build-Rebuild,就会动态生成对应的接口类。

项目背景

在项目重构时,当面的硬编码实现的api类,需要把具体类的方法抽象出来,新建接口类加入抽象方法,然后才能加入单元测试,或实现装饰者模式等处理。但是如果面对大量的api类,手动是很繁琐而且非常不自动化的。
面对大量的类,如何快速的提取出抽象方法以及它们的返回值注解/参数注解。

关于命名Reverse反向,一般的编码是从接口(上层)->实现类(下层)。但是重构时面对实现类(下层),反而需要更层的接口类,所以就是反向。

项目原理

Java提供注解处理器,在项目编译前期,注解器有机会处理代码。利用这个处理器,我们可以实现对现有类的扫描,然后根据扫描得到的信息,利用工具生成java文件。

说明

下面说明一些细节问题

关于命名

参照阿里巴巴Java开发手册-编程规约-命名风格。
接口和实现类的命名规则:
- 【强制】对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部
的实现类用 Impl 的后缀与接口区别。
正例: CacheServiceImpl 实现 CacheService 接口
- 【推荐】如果是形容能力的接口名称,取对应的形容词做接口名 ( 通常是–able 的形式)。
正例: AbstractTranslator 实现 Translatable。

这里有两套规则,对应的我的在注解中有两个可选项。其中默认实现【强制】的Impl命名风格。

 /**
   * 被标注类的名称后缀 默认是命名是 Impl
   * 可以根据实际修改,必须是被标记类的后缀。
   * 默认规则 如:AccountMangerImpl->AccountManager
   */
  String suffixName() default Suffix;

  /**
   * 默认的接口实现类后缀
   */
  String Suffix = "Impl";

  /**
   * 指定 生成接口类的名称
   * 默认为空:裁剪约定后缀的标记类的 {@link #suffixName}
   * 非空输入:生成指定名称的接口 忽略后缀检查
   * 如:AbstractTranslator->Translatable
   */
  String superName() default "";

关于生成的java文件

当rebuild项目时,会在app-build-generated-sourceapt文件下,生成目标类的同名包以及动态生成的接口类。最终在apk打包过程中源码.java文件和apt下的.java文件会合并打包。在我们继承接口时即implements AccountManager会认为是导入同名包的下的代码,不会有import语句。

辅助重构-最终弃用

重构是一个渐进的过程,从最初的实现类反向生成接口类。刚开始可能没有大面积的重构或者抽象能力不足,接口类随时会修改。动态的反向可以带来便利。只要修改实现类方法参数/返回值以及它们的注解,rebuild就会马上生成接口。一次修改(否则就要修改接口类和实现类的方法,两次修改)。

当重构完成或者更高层抽象分离出来(比如动态代理,直接抽象实现方法),我们的接口类最终确定,就不需要build项目时动态生成反向接口类,每次build动态生成反而可能拖慢了项目的编译时间。这时就可以从动态文件包app-build-generated-sourceapt中复制出接口类放到适合的包。从而弃用@ReverseSuper注解。完成它辅助重构的使命。

项目灵感

源自大名鼎鼎的butterknife对注解处理器的应用。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Card361401376/article/details/79960949

webservice接口,Axis2反向生成java客户端代码

D:\Software\axis2-1.6.2\bin>wsdl2java.bat -uri http://10.33.49.63:8181/traffic/ws/moreLikeThisHBase?...
  • baidu_20608025
  • baidu_20608025
  • 2018-01-30 11:48:55
  • 18

MyEclipse将反向工程出来的DAO转为接口的方法

右键DAO类->Refactor->Extract Interface 然后勾选上需要的方法和常量,再明明该Interface即可....
  • lc0817
  • lc0817
  • 2015-06-23 09:01:28
  • 1575

Android逆向-python写一个.class分析辅助脚本

0x00 前言 起因 说明 0x01 主函数 程序结构图 程序main函数 程序说明 0x02 python classpy -h python classpy -v firstclass p...
  • qq_36869808
  • qq_36869808
  • 2018-01-13 21:38:00
  • 158

OCI接口类 OCI接口类

  • 2011年07月26日 14:06
  • 5KB
  • 下载

win7扫雷逆向调试

目标:找到可判断是否是雷的地址、雷区宽度高度地址
  • xfgryujk
  • xfgryujk
  • 2016-10-27 19:10:50
  • 1044

接口类

昨天我们学习了抽象类,即是在本类中不能被实例化对象,我们今天又学习接口类,其是比抽象类更加抽象。在其类头中必须使用Interface来进行修饰,而且其中的方法必须都是抽象方法,该方法省略了abstra...
  • JDKANDER
  • JDKANDER
  • 2016-04-12 22:53:25
  • 220

接口是没有析构函数的

在MSDN文档里,把Visual C++接口描述如下: Can inherit from zero or more base interfaces.Cannot inherit from a b...
  • DarkMagician_Potter
  • DarkMagician_Potter
  • 2014-10-09 16:31:27
  • 852

VS 2017 众多重构插件

1、没有任何插件的情况下:  (就是Ctrl + .)   注意:这个.  要是英文的才行!右键菜单也是这三项   不知道如何关闭!2、 使用  R# 的情况下:    (VA 插件就不看了,因为总不...
  • u010019717
  • u010019717
  • 2017-08-03 09:17:31
  • 3776

c++类接口的实现

通过c++类来模拟实现接口 第一步:         使用vitual 定义函数的功能模块,相当于实现公共界面设计       注意一定要不要忘记添加虚—析构函数 第二步:     ...
  • CAIYAODENG
  • CAIYAODENG
  • 2014-12-02 13:55:52
  • 3924

《重构》电子书pdf版

  • 2008年08月30日 00:26
  • 11.93MB
  • 下载
收藏助手
不良信息举报
您举报文章:@ReverseSuper-反向接口类辅助重构
举报原因:
原因补充:

(最多只允许输入30个字)