米菲纸尿裤微商发货渠道自定义AutoService、Javapoet讲解

一、上篇文章提到自定义米菲纸尿裤微商发货渠道processor中用到AutoService

文章中我们用到了AutoService, 使用@AutoService(Processor.class),编译后

麦139*261*150*05(微电)META-INF


AutoService会自动在META-INF文件夹下生成Processor配置信息文件,该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定,方便快捷。应用依赖如下:

1

compile ‘com.google.auto.service:auto-service:1.0-rc2‘

  

二、javapoet的运用

JavaPoet是square推出的开源java代码生成框架,米菲纸尿裤微商发货渠道提供Java Api生成.java源文件。这个框架功能非常有用,我们可以很方便的使用它根据注解、数据库模式、协议格式等来对应生成代码。通过这种自动化生成代码的方式,可以让我们用更加简洁优雅的方式要替代繁琐冗杂的重复工作。引用依赖:


1

compile ‘com.squareup:javapoet:1.7.0‘

 

该项目结构如下:

相关类介绍

JavaFile A Java file containing a single top level class 用于构造输出包含一个顶级类的Java文件
TypeSpec A generated class, interface, or enum declaration 生成类,接口,或者枚举
MethodSpec A generated constructor or method declaration 生成构造函数或方法
FieldSpec A generated field declaration 生成成员变量或字段
ParameterSpec A generated parameter declaration 用来创建参数
AnnotationSpec A generated annotation on a declaration 用来创建注解
 

在JavaPoet中,JavaFile是对.java文件的抽象,米菲纸尿裤微商发货渠道TypeSpec是类/接口/枚举的抽象,MethodSpec是方法/构造函数的抽象,FieldSpec是成员变量/字段的抽象。这几个类各司其职,但都有共同的特点,提供内部Builder供外部更多更好地进行一些参数的设置以便有层次的扩展性的构造对应的内容

常用api:

  • addStatement() 方法负责分号和换行
  • beginControlFlow() + endControlFlow() 需要一起使用,提供换行符和缩进。
  • addCode() 以字符串的形式添加内
  • returns 添加返回值类型
  • .constructorBuilder() 生成构造器函数
  • .addAnnotation 添加注解
  • addSuperinterface 给类添加实现的接口
  • superclass 给类添加继承的父类
  • ClassName.bestGuess(“类全名称”) 返回ClassName对象,这里的类全名称表示的类必须要存在,会自动导入相应的包
  • ClassName.get(“包名”,”类名”) 返回ClassName对象,不检查该类是否存在
  • TypeSpec.interfaceBuilder(“HelloWorld”)生成一个HelloWorld接口
  • MethodSpec.constructorBuilder() 构造器
  • addTypeVariable(TypeVariableName.get(“T”, typeClassName)) 
    会给生成的类加上泛型

占位符

    • $L代表的是字面量
    • $S for Strings
    • $N for Names(我们自己生成的方法名或者变量名等等)
    • $T for Types

      三、javapoet的使用


      1

      2

      3

      4

      5

      6

      7

      package com.example.helloworld;

      public final class HelloWorld {

        public static void main(String[] args) {

          System.out.println("Hello, JavaPoet!");

        }

      }

        

      上面的代码我们可以调用javapoet的api方法去生成:米菲纸尿裤微商发货渠道


      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      MethodSpec main = MethodSpec.methodBuilder("main")

          .addModifiers(Modifier.PUBLIC, Modifier.STATIC)

          .returns(void.class)

          .addParameter(String[].class"args")

          .addStatement("$T.out.println($S)", System.class"Hello, JavaPoet!")

          .build();

      TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")

          .addModifiers(Modifier.PUBLIC, Modifier.FINAL)

          .addMethod(main)

          .build();

      JavaFile javaFile = JavaFile.builder("com.example.helloworld", helloWorld)

          .build();

      javaFile.writeTo(System.out);

        


      1

      <span style="font-size: 14px;">addModifiers对方法的修饰约束,addParameter添加方法参数 ,addStatement方法体,returns返回值,最后写入java文件中<br data-filtered="filtered"><br data-filtered="filtered">代码和控制流程<br data-filtered="filtered"><span><span>大多数JavaPoet的API使用普通的旧的不可变的Java对象。</span><span>也有建设者,方法链和可变参数使API友好。</span><span>JavaPoet为类和接口(</span></span><code>TypeSpec</code><span><span>),fields(</span></span><code>FieldSpec</code><span><span>),方法和构造函数(</span></span><code>MethodSpec</code><span><span>),参数(</span></span><code>ParameterSpec</code><span><span>)和注释(</span></span><code>AnnotationSpec</code><span><span>)提供模型。</span></span><br data-filtered="filtered"><br data-filtered="filtered"></span>


      1

      2

      3

      4

      5

      6

      7

      MethodSpec main = MethodSpec.methodBuilder("main")

          .addCode(""

              "int total = 0;\n"

              "for (int i = 0; i < 10; i++) {\n"

              "  total += i;\n"

              "}\n")

          .build();

        

      则会生成下面的代码


      1

      2

      3

      4

      5

      6

      void main() {

        int total = 0;

        for (int i = 0; i < 10; i++) {

          total += i;

        }

      }

        

      我们可以子自定义方法去调用


      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      private MethodSpec computeRange(String name, int from, int to, String op) {

        return MethodSpec.methodBuilder(name)

            .returns(int.class)

            .addStatement("int result = 0")

            .beginControlFlow("for (int i = " + from + "; i < " + to + "; i++)")

            .addStatement("result = result " + op + " i")

            .endControlFlow()

            .addStatement("return result")

            .build();

      }

        

      调用上面的方法后computeRange("multiply10to20", 10, 20, "*") 生成下面的java代码


      1

      2

      3

      4

      5

      6

      7

      int multiply10to20() {

        int result = 0;

        for (int i = 10; i < 20; i++) {

          result = result * i;

        }

        return result;

      }

        

      对于$T泛型 ,我们的Java程序员喜欢我们的类型:他们让我们的代码更容易理解。JavaPoet在船上。它具有丰富的内置支持类型,包括自动生成import 语句。只是$T用来引用类型:


      1

      2

      3

      4

      5

      6

      7

      8

      9

      package com.example.helloworld;

      import java.util.Date;

      public final class HelloWorld {

        Date today() {

          return new Date();

        }

      }

        

      要生成上面代码 可以用下面的javapoet去实现


      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      MethodSpec today = MethodSpec.methodBuilder("today")

          .returns(Date.class)

          .addStatement("return new $T()", Date.class)

          .build();

      TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")

          .addModifiers(Modifier.PUBLIC, Modifier.FINAL)

          .addMethod(today)

          .build();

      JavaFile javaFile = JavaFile.builder("com.example.helloworld", helloWorld)

          .build();

      javaFile.writeTo(System.out);

        

      JavaPoet支持import static。它通过明确收集类型成员名称来完成。见下面代码:


      1

      2

      3

      4

      5

      JavaFile.builder("com.example.helloworld", hello)

          .addStaticImport(hoverboard, "createNimbus")

          .addStaticImport(namedBoards, "*")

          .addStaticImport(Collections.class"*")

          .build();

        

      如果我们想生成构造Constructors,也很简单:


      1

      2

      3

      4

      5

      6

      7

      public class HelloWorld {

        private final String greeting;

        public HelloWorld(String greeting) {

          this.greeting = greeting;

        }

      }

        

      要实现上面java代码,用javapoet去实现,如下:


      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      MethodSpec flux = MethodSpec.constructorBuilder()

          .addModifiers(Modifier.PUBLIC)

          .addParameter(String.class"greeting")

          .addStatement("this.$N = $N""greeting""greeting")

          .build();

      TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")

          .addModifiers(Modifier.PUBLIC)

          .addField(String.class"greeting", Modifier.PRIVATE, Modifier.FINAL)

          .addMethod(flux)

          .build();

        

      还可定义枚举类米菲纸尿裤微商发货渠道


      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      TypeSpec helloWorld = TypeSpec.enumBuilder("Roshambo")

          .addModifiers(Modifier.PUBLIC)

          .addEnumConstant("ROCK")

          .addEnumConstant("SCISSORS")

          .addEnumConstant("PAPER")

          .build();

      public enum Roshambo {

        ROCK,

        SCISSORS,

        PAPER

      }

        

      还有匿名内部类的实现


      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      TypeSpec comparator = TypeSpec.anonymousClassBuilder("")

          .addSuperinterface(ParameterizedTypeName.get(Comparator.class, String.class))

          .addMethod(MethodSpec.methodBuilder("compare")

              .addAnnotation(Override.class)

              .addModifiers(Modifier.PUBLIC)

              .addParameter(String.class"a")

              .addParameter(String.class"b")

              .returns(int.class)

              .addStatement("return $N.length() - $N.length()""a""b")

              .build())

          .build();

      TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")

          .addMethod(MethodSpec.methodBuilder("sortByLength")

              .addParameter(ParameterizedTypeName.get(List.class, String.class), "strings")

              .addStatement("$T.sort($N, $L)", Collections.class"strings", comparator)

              .build())

          .build();

      This generates a method that contains a class that contains a method:

      void sortByLength(List<String> strings) {

        Collections.sort(strings, new Comparator<String>() {

          @Override

          public int compare(String a, String b) {

            return a.length() - b.length();

          }

        });

      }

        

      也可创建注解:


      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      MethodSpec toString = MethodSpec.methodBuilder("toString")

          .addAnnotation(Override.class)

          .returns(String.class)

          .addModifiers(Modifier.PUBLIC)

          .addStatement("return $S""Hoverboard")

          .build();

        //结果如下:

        @Override

        public String toString() {

          return "Hoverboard";

        }

        

      创建注释javadoc


      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      MethodSpec dismiss = MethodSpec.methodBuilder("dismiss")

          .addJavadoc("Hides {@code message} from the caller‘s history. Other\n"

              "participants in the conversation will continue to see the\n"

              "message in their own history unless they also delete it.\n")

          .addJavadoc("\n")

          .addJavadoc("<p>Use {@link #delete($T)} to delete the entire\n"

              "conversation for all participants.\n", Conversation.class)

          .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)

          .addParameter(Message.class"message")

          .build();

        /**

         * Hides {@code message} from the caller‘s history. Other

         * participants in the conversation will continue to see the

         * message in their own history unless they also delete it.

         *

         * <p>Use {@link #delete(Conversation)} to delete the entire

         * conversation for all participants.

         */

        void dismiss(Message message);

        

      用法很多,还可以用FieldSpec.builder创建属性变量,ParameterSpec创建方法参数

      四、总结 问题

      如果我们在自定义processor的时候找不到javax.annotation.processing.*包下的类,则创建java module 而非android module

时间: 2024-10-08 04:58:59

米菲纸尿裤微商发货渠道自定义AutoService、Javapoet讲解的相关文章

米菲纸尿裤管理系统米菲纸尿裤返利系统分析

米菲纸尿裤管理系统米菲纸尿裤返利系统分析:151.1222.4001(微信同步)米菲纸尿裤管理系统,米菲纸尿裤防伪系统,米菲纸尿裤代理商进货系统,米菲纸尿裤返利系统,米菲纸尿裤分红系统,米菲纸尿裤分销系统,米菲纸尿裤app开发,米菲纸尿裤O2O商城开发,米菲纸尿裤二维码红包系统,米菲纸尿裤追溯系统. 比起大人的身体,宝宝的身体是极其脆弱的,有时候可能某些不经意的东西就会对宝宝造成难以预测的伤害.而在我们的日常家居用品中,危害宝宝健康的也不在少数,那么,在现实生活中存在很多伪造产品,对于人们有着一

米菲纸尿裤直销系统云仓代理平台

米菲云仓微商管理系统开发陈洋150-1315-1740电微.代理系统,发货系统,控价系统,授权系统,防窜货管控系统,积分结算系统,订单物流系统,品牌查询系统,下单进货系统,退换货系统,软件,平台,商城,防伪,分销,APP,微商城. 米菲纸尿裤微商管理系统怎么做?只要充值648元货款即可加盟米菲纸尿裤微商,拥有米菲纸尿裤代理权,且没有区域限制.米菲模式全自动下单系统,一件代发包邮政策减少中间代理商成本.交2万成为最高级别代理,代理享受公司返点50-1000推荐奖励,和2-5块每包的返佣奖励. Mi

凯儿得乐纸尿裤微商下单管理系统开发

凯儿得乐纸尿裤微商下单管理系统开发.微商下单管理系统开发找老赵:151-1887-0514电微微商下单管理软件开发.凯儿得乐微商下单管控软件开发.微商后台下单系统开发 我们先来了解一下什么是微商下单系统? 我们都知道从微商的行业出来之后,各行各业都是从实体企业转型到微商这方面发展!一个企业发展的代理商越来越多的时候,就要相对应用到系统管理微商:微商下单系统主要的作用是管理微商的下单.进货.发货等方面的操作系统 为什么要做微商下单系统,微商下单系统有什么样作用? 企业要做微信下单系统,因为刚刚开始

皇兒宝纸尿裤微商管理系统

皇兒宝纸尿裤微商管理系统<苏134-1619-5045>皇兒宝纸尿裤代理下单系统,皇兒宝纸尿裤微商管理软件,皇兒宝纸尿裤微商管理系统,皇兒宝模式微商在线下单系统,皇兒宝微商代理在线下单系统. 毫无疑问未来母婴行业以实体店支撑线上市场才是王道,这也就是微商现在成为母婴行业的新兴规范化发展模式.一方面,线上购物,大大节省了时间成本,对宝妈来说,是最便捷的选择,另一方面,卖家又是消费群体,消费者直接面对品牌方,在纸尿裤品质把控方面信息更为畅通,产品改进效率也将随之提高. 一.微商管理系统能够为企业解

微商发货管理软件开发公司—分析

也许你会好奇,微商发货管理软件是什么?有什么用?有什么优势?别急,下面由小编为你揭晓.(微商发货管理软件开发服务热线:杨13247334389,微信同步!) 一.微商发货管理软件简单介绍: 微商发货管理软件是我们针对微商企业存在"人工记账繁琐""订单多难管理""不同代理商业绩无法统计"的痛点问题而开发的一套在线订货收付款的管理软件,让微商企业可以在线记录代理商身份(级别关系),在线完成订单交易以及在线统计代理商业绩.发货量.订单量.库存量等数据信

禅道 给禅道缺陷增加是否遗留及来源渠道自定义字段

给禅道缺陷增加是否遗留及来源渠道自定义字段 by:授客 QQ:1033553122 实践环境 禅道项目管理软件9.2.1 .8.0开源Linux版 给数据库表zt_bug新增自定义字段 ALTER TABLE `zt_bug` ADD COLUMN isHistory VARCHAR(10) AFTER severity; ALTER TABLE `zt_bug` ADD COLUMN channel VARCHAR(50) AFTER severity; 修改zentaopms/module/

[052] 微信公众平台开发视频公开课第2讲-自定义菜单开发讲解

微信公众平台开发视频公开课第2讲将为大家讲解自定义菜单的相关知识,时间是2014年5月24日20:00-22:00.本次课程的大纲如下: 1.自定义菜单简介 1)如何获得菜单权限 2)菜单按钮分类(click和view) 2.编辑模式下的菜单使用 1)创建菜单 2)预览发布 3)注意事项 3.开发模式下的菜单使用 1)菜单接口介绍 2)如何发起https请求(两种方法,IBM JDK环境) 3)获取access_token 4)如何封装菜单结构 5)创建菜单 6)处理菜单点击事件 7)菜单的查询

米菲微商返利分销积分商城系统开发案例

随着微商的盛行,越来越多的微商冲次着我们的世界,然而这么多微商中为什么只有米菲等少数可以从中脱颖而出呢??下面小编带你一起感受米菲,为你揭开米菲的成功面纱 米菲纸尿裤模式开发系统<迟/159-1258-1292>米菲代理商模式开发系统,米菲纸尿裤商城模式搭建,米菲商城自动下单系统开发模式. 随着互联网的不断发展,越来越多的传统企业转型互联网做电商.那么,在这些已经转型的企业里有大部分是中途放弃的,原因是因为他们第一次转型,而转型后却没有一个好的思维,准确的来说是不懂互联网思维,且营销.推广.自

米菲微商代理授权系统开发

米菲微商代理授权系统开发  电微136-6246-4798 今年下半年,非常多的微商企业咨询赢在移动,能否开发类似米菲的微商系统,让代理商统一在微商系统后台下单,不同层级显示不同价格,而且要自带计算各层级代理商的业绩,根据代理商的业绩进行返点.米菲微商授权系统开发详情请询136-6246-4798. 赢在移动作为微商管理系统开发商,长期专注于各自模式的微商系统定制开发服务.针对各大微商品牌的需求,我们为多家企业开发了不同功能的微商系统,包括类似米菲的微商后台下单系统.微商授权系统,微商防窜货系统