展开

关键词

编译时注解(一)AbstractProcessor实战

com.google.auto.service:auto-service:1.0-rc2' @AutoService(Processor.class) public class MyProcessor extends AbstractProcessor R.layout.activity_main); MethodTest test = new MethodTest(); test.getMessage(); } } 注意:注解类和AbstractProcessor AbstractProcessor中生成java类,可以使用JavaPoet开源库进行编写,提升效率

5.5K20

聊聊AbstractProcessor和Java编译流程

github.com/ 掘金文章 我:我写过一个路由跳转库,我通过了AbstractProcessor生成了路由表的注册类。 面试官: 既然你写过AbstractProcessor,那么我们来聊聊这个吧。 我:OK,放马过来,谁怂谁是狗。 面试官:那么kapt和transform有什么差别啊? 我:AbstractProcessor只能处理注解,然后根据注解通过javapoet生成一个新的java类。 面试官:嗯,那么下一个问题,你知道AbstractProcessor是在编译时的哪个环节操作的吗? 我:汪? 面试官:那么我们继续聊聊AbstractProcessor,当获取到的注解之后,如何判断实现了注解的Class是否继承自activity。 我:汪汪汪汪!!!!!

2.5K50
  • 广告
    关闭

    【玩转 Cloud Studio】有奖调研征文,千元豪礼等你拿!

    想听听你玩转的独门秘籍,更有机械键盘、鹅厂公仔、CODING 定制公仔等你来拿!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    「Android」通过注解自动生成类文件:APT实战(AbstractProcessor

    二、新建AbstractProcessor类的实现类。 com.autotestdemo.maomao.javalib.VInjector") @SupportedSourceVersion(SourceVersion.RELEASE_6) public class VInjectProcessor extends AbstractProcessor 根本找不到AbstractProcessor类。 原因是AbstractProcessor不在Android SDK里面! 所以我们要建【java工程】 但是我们最终要放在app里面运行的,怎么办? 那我们需要建一个java library的module来做为你主工程的引用工程,专门存放AbstractProcessor实例的相关内容。 建好library之后,需要在主工程引用它: ? VInjector(id=1,name="Maomao",text="这是动态代码生成的") public class MainActivity extends AppCompatActivity { 四、实现AbstractProcessor

    80330

    Java编译时注解自动生成代码

    虚处理器AbstractProcessor 我们首先看一下处理器的API。 每一个处理器都是继承于AbstractProcessor,如下所示: public class MyProcessor extends AbstractProcessor { @Override import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.processing.AbstractProcessor javax.lang.model.util.ElementFilter; import javax.lang.model.util.Elements; public class MyProcessor extends AbstractProcessor ); } set.add("com.robert.processor.Serialize"); return set; } } 我们经常使用的ButterKnife这个框架就很好的使用了AbstractProcessor

    7620

    Android中Aop和Apt有什么区别?

    DataBinding Dagger2 ButterKnife EventBus3 DBFlow AndroidAnnotation 使用姿势 1,在android工程中,创建一个java的Module,写一个类继承AbstractProcessor com.annotation.SingleDelegate", "com.annotation.MultiDelegate" }) public class AnnotationProcessor extends AbstractProcessor ; new MultiDelegateProcessor().process(set, roundEnvironment, this); return true; } } 2,重写AbstractProcessor extends TypeElement> set, RoundEnvironment roundEnv, AnnotationProcessor abstractProcessor constructorBuilder, delegate); // 检查是否继承其它接口 builder = processSuperSingleDelegate(abstractProcessor

    30320

    annotationProcessor 自动生成代码(下)

    AbstractProcessor可以做的事还有很多,我们不可能一一列举。我们最重要的是明白,AbstractProcessor的运行时机、可操作范围和能提供给我们的东西。 可操作范围 AbstractProcessor是在编译期执行的,同时,它通常处于一个纯Java module中,我们无法依赖Android的相关组件。 javaFile.writeTo(filer); } catch (IOException e) { e.printStackTrace(); } } 以上,就是AbstractProcessor

    90930

    自定义Processor组件

    我们自定义Processor时最常用的是继承AbstractProcessor,首先看一下AbstractProcessor的继承关系: ? public abstract class AbstractProcessor extends AbstractSessionFactoryProcessor { // 控制器是先调用的AbstractProcessor context, final ProcessSession session) throws ProcessException; } 这里额外多提一点:NIFI的会话(session)是可以支持事务的,AbstractProcessor 那么接下来,我们在这个MyProcessor.java类中直接继承AbstractProcessor就可以了。 author 酷酷的诚 * @date 2019-06-20 13:59 */ public abstract class AbstractJsonCleaningProcessor extends AbstractProcessor

    57210

    AnnotationProcessor实战:实现ButterKnife的findViewById方法

    四个参数中已经有了三个参数,最后一个宿主参数可以另外传进去 2.具体实现细节 (1)ViewFinder和它的实现类ActivityViewFinder就是实现findViewById的,可以这么写,其实也可以直接写在AbstractProcessor 具体的实现要等后面AbstractProcessor的实现 (3)BindViewField是用来保存标注了BindView的信息的,也就是之前说的三个参数 (4)AnnotatedClass 是用来管理所有 BindViewField变量的 (5)最后着重看一下AbstractProcessor的process的方法实现 @Override public boolean process(Set

    22720

    XTask与RxJava的使用对比

    () -> { // 1.获取产品信息 new GetProductInfoProcessor(logger, productId).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter / 4.送去市场部门评估售价 new GivePriceProcessor(logger, product).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter singleIO().execute(() -> { new GetBriefInfoProcessor(logger, productId).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter { new GetPriceInfoProcessor(logger, product.getPriceId()).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter -> { new GetRichInfoProcessor(logger, product.getRichId()).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter

    9820

    你还在写垃圾代码?快用 Java 8 重构传统设计模式吧,是真的优雅!

    {     Processor getNextProcessor();     void process(String param); } 抽象实现类 public abstract class AbstractProcessor  implements Processor {     private Processor next;     public AbstractProcessor(Processor processor Override     public abstract void process(String param); } 定义2个具体的实现 public class ProcessorImpl1 extends AbstractProcessor             getNextProcessor().process(param);         }     } } 及 public class ProcessorImpl2 extends AbstractProcessor

    8820

    Android自定义processor实现bindView功能的实例

    编译时注解的核心依赖APT(Annotation Processing Tools)实现,原理是在某些代码元素上(如类型、函数、字段等)添加注解,在编译时编译器会检查AbstractProcessor的子类 Java API已经提供了扫描源码并解析注解的框架,你可以继承AbstractProcessor类来提供实现自己的解析注解逻辑。 AbstractProcessor位于javax.annotation.processing包下,我们自己写processor需要继承它: public class LProcessor extends AbstractProcessor { @Override public synchronized void init(ProcessingEnvironment processingEnvironment 我们先创建一个java module LProcessor @AutoService(Processor.class) public class LProcessor extends AbstractProcessor

    24620

    责任链、领域模型和事务的恩怨情仇

    4.1 引入了模板模式 模板类是AbstractProcessor,它的process方法来实现所有Processor的公共逻辑,代码如下: public abstract class AbstractProcessor protected abstract boolean doProcess(ShoppingModel shoppingModel); } 这样每个节点类就不需要实现IProcessor的process方法,而是继承AbstractProcessor } } 4.3 StorageProcessor控制事务 事务需要由StorageProcessor来控制,代码如下: public class StorageProcessor extends AbstractProcessor ❞ 类似下面伪代码: public class OrderProcessor extends AbstractProcessor { @Resource private OrderMapper

    7210

    利用java8对设计模式的重构

    { Processor getNextProcessor(); void process(String param); } 抽象实现类 public abstract class AbstractProcessor implements Processor { private Processor next; public AbstractProcessor(Processor processor Override public abstract void process(String param); } 定义2个具体的实现 public class ProcessorImpl1 extends AbstractProcessor getNextProcessor().process(param); } } } 及 public class ProcessorImpl2 extends AbstractProcessor

    777120

    手写 ButterKnife BindView

    javapoet:1.9.0' implementation project(':ButterKnife-Annotions') } 写一个生成代码的类ButterKnifeProcessor继承AbstractProcessor public class ButterKnifeProcessor extends AbstractProcessor { @Override public boolean process AutoService(Processor.class) @AutoService(Processor.class) public class ButterKnifeProcessor extends AbstractProcessor import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.processing.AbstractProcessor AutoService(Processor.class) @AutoService(Processor.class) public class ButterKnifeProcessor extends AbstractProcessor

    37520

    JVM系列六(自定义插入式注解器).

    要实现注解处理器首先要做的就是继承抽象类 javax.annotation.processing.AbstractProcessor,然后重写它的 process() 方法,process() 方法是 另外 AbstractProcessor 还有一个很常用的实例变量 “processingEnv”,它在 init() 方法执行的时候创建,它代表了注解处理器框架提供的一个上下文环境,要创建新的代码、向编译器输出信息 SupportedAnnotationTypes("*") @SupportedSourceVersion(SourceVersion.RELEASE_8) public class NameCheckProcessor extends AbstractProcessor

    56520

    使用SseEmitter不断向网页输出结果

    org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:153) ~[tomcat-embed-core-8.5.16.jar:8.5.16] at org.apache.coyote.AbstractProcessor.dispatch (AbstractProcessor.java:224) ~[tomcat-embed-core-8.5.16.jar:8.5.16] at org.apache.coyote.AbstractProcessorLight.process

    1.4K10

    Navigation深入浅出,到出神入化,再到实战改造(三)

    com.google.auto.service:auto-service:1.0-rc6' 如果想要注解处理器能够在编译器生成代码,需要做一个配置说明,这里有两种配置方法: 具体参考这篇文章:Java AbstractProcessor SupportedAnnotationTypes({"org.devio.hi.nav_annotation.Destination"}) public class NavProcessor extends AbstractProcessor 创建Java库是因为在使用自定义AbstractProcessor需要使用到javax包中的相关类和接口,这个在android库中并不存在,所以需要使用到Java库。 看代码如果难懂,下面对面几篇文章并附送源码: Navigation深入浅出,到出神入化,再到实战改造(一) Navigation深入浅出,到出神入化,再到实战改造(二) Java AbstractProcessor 实现自定义ButterKnife Java进阶--编译时注解处理器(APT)详解 Java AbstractProcessor实现自定义ButterKnife JavaPoet的使用指南 Android

    9920

    Lombok天天用,却不知道它的原理是什么?

    APT的核心是AbstractProcessor类。 正常情况下使用APT工具只是能够生成一些文件(不仅仅是我们想象的class文件,还包括xml文件等等之类的),并不能修改原有的文件信息。 ANNOTATION_TYPE, 15 16 PACKAGE, 17 18 TYPE_PARAMETER, 19 20 TYPE_USE 21 } 定义注解处理器 我们要定义注解处理器的话,那么就需要继承AbstractProcessor @SupportedAnnotationTypes("aboutjava.annotion.MyGetter") 3 public class MyGetterProcessor extends AbstractProcessor 也就是我们写具体逻辑的地方 我们是演示一下如何通过继承AbstractProcessor类来实现在编译时生成类,所以我们在process方法中书写我们生成类的代码。如下所示。

    22130

    Android APT 实例讲解

    此类注解框架的代表有 ButterKnife、Dragger2、EventBus 等 Java API 已经提供了扫描源码并解析注解的框架,开发者可以通过继承 AbstractProcessor 类来实现自己的注解解析逻辑 APT 的原理就是在注解了某些代码元素(如字段、函数、类等)后,在编译时编译器会检查 AbstractProcessor 的子类,并且自动调用其 process() 方法,然后将添加了指定注解的所有代码元素作为参数传递给该方法 R.id.et_bookName) EditText et_bookName; 1.1、建立 Module 首先在工程中新建一个 Java Library,命名为 apt_processor,用于存放 AbstractProcessor www.jianshu.com/u/9df45b87cfdf */ @AutoService(Processor.class) public class BindViewProcessor extends AbstractProcessor key) { MMKV kv = MMKV.defaultMMKV(); kv.remove(key); } } 2.4、编写代码生成规则 一样是需要继承 AbstractProcessor

    55940

    android APT 使用

    * @return     */    String[] value() default {}; } 2.创建 java-library类型的 module 作为 compiler 自定义 AbstractProcessor com.xxx.appcompiler.compiler.Compiler Compiler类内容 @AutoService(Processor.class) public class Compiler extends AbstractProcessor

    33530

    扫码关注腾讯云开发者

    领取腾讯云代金券