有时候,我们需要开发大量重复的代码。每段代码,只有少数成员变量命名不同。这样的场景在开发接口层时,感觉尤为明显。 接口类可能只是实现类的抽象形式。但每个实现方法,我们都要写一遍接口。且每个接口方法的命名,可能和实现方法完全一致。 那么,能否有一种方案,让我们用代码自行生成接口呢?这个方案之前是apt,如今是 annotationProcessor
在 【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 ) 博客中 声明了 支持的注解类型 , 并在 Activity 中使用了注解 , 在 注解处理器 中检测出来使用注解的 类节点 TypeElement ;
在之前的“Java中的屠龙之术:如何修改语法树”中,我们详细介绍了如何使用Javac源码提供的工具类来修改语法树。
接下来我们模仿ButterKnife 实现一个@BindView的注解来了解Java注解处理器的使用。
JakeWharton 是 Android 大神,同时也是开源狂魔。他开源的项目特点是小而美,且应用广泛,比如 butterknife、RxBinding、hugo 等,本文从受众最广泛,star 最多的 ButterKnife 讲起。
在annotationProcessor 自动生成代码(上)中,我们介绍了如何通过注解和javapoet生成一个简单的HelloWorld.java。AbstractProcessor可以做的事还有很多,我们不可能一一列举。我们最重要的是明白,AbstractProcessor的运行时机、可操作范围和能提供给我们的东西。
注解处理器 AbstractProcessor 中的 process 方法可能会调用多次 , 在生成代码时 , 一定要注意 , 检测到 注解节点 后再生成代码 ;
在 组件化 中 , 使用 路由组件 进行界面跳转时 , 涉及到参数的传递 , 传递过去的参数需要在目的地 Activity 的 onCreate 方法中 , 调用 getIntent().getXxxExtra() 获取到传递的值 ;
今天带大家深入源码来看看Spring Boot 3.0 中的一个大变化:新增的 Graalvm aot 支持。 一、Spring core Spring framework 6.0 中 Spring core 有了大变更,添加了下列目录: GraalVM feature —— GraalVM 允许客户端拦截本机映像生成并运行自定义初始化不同阶段的代码。(GraalVM APi 可能随时改变,所以没被纳入到框架公共 API) aot —— Spring AOT 基础设施的核心包。 javapoet —— 用于
github:https://github.com/square/javapoet
不管是Android开发的老司机也好,新司机也罢,想必大家都对findViewById这种样板代码感到了厌倦,特别是进行复杂的UI界面开发的时候,这种代码就会显的非常的臃肿,既影响开发时的效率,又影响美观。 俗话说,不想偷懒的程序猿不叫工程师,那有什么方法可以让我们写这样的代码更加的有效率呢? 使用依赖注入框架 如果你不想写那些无聊的样板代码,那么你可以尝试一下现有的依赖注入库。ButterKnife作为Jake Wharton大神写的开源框架,号称在编译期间就可以实现依赖注入,没有用到反射,不会降低程序性
WX20200731-155033_PC.png 官网 https://github.com/square/javapoet 使用: 本次使用的是 implementation 'com.squareup:javapoet:1.8.0' Javapoet 主要是配合 APT 工具使用 在编译期间 生成 java 代码. 栗子 目标代码: package com.ben.poet; import android.support.v7.app.AppCompatActivity; import andr
注解处理器 为每个 Module 模块生成一个路由表 , 该模块下凡是被 @Route 标注的路由节点都在该路由表中维护 ;
在 【Android 组件化】路由组件 ( 注解处理器中使用 JavaPoet 生成代码 ) 博客中在注解处理器中 , 简单的使用了 JavaPoet 生成了 Java 代码 ;
前言 有一定开发经验的同学对AOP应该很了解吧,如果不了解,可以先查看如下文章进行科普一下https://baike.baidu.com/item/AOP/1332219?fr=aladdin,再来阅
越来越多第三方库使用apt技术,如DBflow、Dagger2、ButterKnife、ActivityRouter、AptPreferences。在编译时根据Annotation生成了相关的代码,非常高大上但是也非常简单的技术,可以给开发带来了很大的便利。
要实现findViewById,需要四个参数(控件类型,控件变量名,宿主view(通常是activity,我们一般省去),以及控件id) BindView 通常是如下使用的
在现阶段的Android开发中,注解越来越流行起来,比如ButterKnife,Retrofit,Dragger,EventBus等等都选择使用注解来配置。按照处理时期,注解又分为两种类型,一种是运行时注解,另一种是编译时注解,运行时注解由于性能问题被一些人所诟病。编译时注解的核心依赖APT(Annotation Processing Tools)实现,原理是在某些代码元素上(如类型、函数、字段等)添加注解,在编译时编译器会检查AbstractProcessor的子类,并且调用该类型的process函数,然后将添加了注解的所有元素都传递到process函数中,使得开发人员可以在编译器进行相应的处理,例如,根据注解生成新的Java类,这也就是EventBus,Retrofit,Dragger等开源库的基本原理。
选择 " 菜单栏 / Run / Edit Configurations… " 选项 ,
ButterKnife 算是一款知名老牌 Android 开发框架了,通过注解绑定视图,避免了 findViewById() 的操作,广受好评!由于它是在编译时对注解进行解析完成相关代码的生成,所以在项目编译时会略耗时,但不会影响运行时的性能。接下来让我们从使用到原理一步步深入了解这把黄油刀的故事! 以下内容基于 butterknife:8.8.1 版本,主要包括如下几个方面的内容:
网上关于 ARouter 源码解析的文章已经不少了,这里简单总结一下自己的理解,方便以后查看和复习
路由除了支持 Activity 之外 , 还要支持 组件间共享的服务 如 工具类 , 逻辑功能 等 ;
apt为何如此重要呢?现今越来越多的第三方库使用了apt技术,Dagger2、ButterKnife、ARouter等,在编译时根据annotation生成相关的代码逻辑,动态的生成Java class文件给开发带来了很大的便利。
APT(Annotation Processing Tool)即注解处理器,是一种处理注解的工具。
所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的左右。
上一期我们已经把butterknife-annotations中的注解变量都已经定义好了,分别为BindView、OnClick与Keep。
在研究了butterknife以后,感觉有必要深入研究一下注解(其实还有好多地方用到过,比如retrofit.以后准备研究的dagger2也用到了注解)
介绍 APT(Annotation Processing Tool)即注解处理器,是一种处理注解的工具,确切的说它是javac的一个工具,它用来在编译时扫描和处理注解。注解处理器以Java代码(或者编译过的字节码)作为输入,生成.java文件作为输出。 简单来说就是在编译期,通过注解生成.java文件。 作用 使用APT的优点就是方便、简单,可以少些很多重复的代码。 用过ButterKnife、Dagger、EventBus等注解框架的同学就能感受到,利用这些框架可以少些很多代码,只要写一些注解就可以了。
去年,和公司的大佬讨论了一系列关于代码的代码化,还记录了一些笔记。在那之后,我开始了各种尝试:如何将代码转变化代码。原先有一些思路,而后过了一年之后,慢慢地练习,又有了一些新的收获。
先建三个module,分别为Butterknife ButterKnife-Annotions ButterKnife-compiler,其中butterknife为Android Module其余的都是Java Module 。
文章较长,欢迎收藏后浅斟慢酌。主要介绍和分析了 RUNTIME 和 CLASS 下两种注解的使用,也欢迎讨论留言。
页面路由框架,无论在android还是在iOS的开发中都是很常见的模块与模块之间的解耦工具,特别是对中大型App而言,基本上都会有自己的路由框架。
我:我写过一个路由跳转库,我通过了AbstractProcessor生成了路由表的注册类。
相信绝大部分的Android开发者都曾使用过ButterKnife, 利用ButterKnife开发者可以快速的实现实体view与xml的绑定,此外还能绑定各种资源、动画、字符串甚至是点击事件等。ButterKnife内部的原理就是通过自定义注解+自定义注解解析器来动态生成代码并为我们的view绑定id的。本文通过实现一个demo性质的ButterKnife项目来展示如何自定义注解+注解解析器。 关于注解本身本文不多做介绍,这里给出一篇讲解注解的文章一小时搞明白自定义注解(Annotation),对注解
考虑这样一种场景:我们是一个汽车生产商,我们生产各种品牌的汽车,比如宝马、奔驰、奥迪等等,为了面向对象开发,我们定义一个基类 Car
由于要把项目内的推送能力提供给别的业务接入,当前已经接入了FCM(谷歌推送),HMS,小米,Vivo,OPPO,极光等好多平台的推送。但是业务接入可能只需要其中的几种而已,抛开SDK设计的一部分,光光从接入成本上来说其实就比较复杂了,下面是问题的汇总啊。
路由框架 仅限于在 集成模式 下使用 , 组件模式下 , 路由框架不起任何作用 ;
组件通信注解框架实践 目录介绍 01.为何需要组件间通信 02.实现同级组件通信方式 03.先看一个简单的案例 04.项目组件通信流程 05.逆向简化注册流程 06.这个注解是做什么的 07.注解是如何生成代码 08.如何定义注解处理器 09.项目库的设计和完善 10.封装该库有哪些特点 11.一些常见的报错问题 12.部分原理分析的说明 01.为何需要组件间通信 明确一个前提:各个业务组件之间不会是相互隔离而是必然存在一些交互的; 业务复用:在Module A需要引用Module B提供的某个功能,比如需
在上一篇《“终于懂了” 系列:组件化框架 ARouter 完全解析(一) 原理详解》中,详细介绍了ARouter的核心原理。其中提到了“帮助类”的概念,也就是在运行时生成 用于帮助填充WareHouse路由元信息的类,这里就涉及到了APT技术。那么本篇就对这一技术点进行介绍,并详细分析ARouter中是如何使用APT来生成帮助类的。
在程序开发的过程中,总会有一些场景需要去写重复冗余的代码。而程序员一般都是懒惰了(懒惰促使人进步 ο ),所以就出现了很多可以减少重复工作的框架或者工具。比如今天要分析的主角—— ButterKnife ,如果你做 Android 开发却没有听说过 ButterKnife 那就 Out 啦。ButterKnife 使用依赖注入的方式来减少程序员去编写一堆 findViewById 的代码,使用起来很方便。那么接下来就一步步地带你深入理解 ButterKnife 框架。PS:最近写的博客篇幅都有点长,请耐心阅读!Logo 图镇楼!
在前文的讲解中对 EventBus 的实现逻辑有了大概的理解之后,我们知道 Java 解析注解可以在运行时解析也可以在编译期间解析。由于运行时解析是通过反射来获取注解标记的类、方法、属性等对象,它的性能要受到反射的影响。因此在一些基础组件中更常见的做法是使用注解解析器技术,像 Dagger、 butterknife、 ARouter 以及本文所接触的 EventBus等框架库都是使用到了注解解析器的技术。接下来我们来实现一个注解解析器。(本文代码有点多)
HarmonyOS对象关系映射(Object Relational Mapping,ORM)数据库是一款基于SQLite的数据库框架,屏蔽了底层SQLite数据库的SQL操作,针对实体和关系提供了增删改查等一系列的面向对象接口。应用开发者不必再去编写复杂的SQL语句, 以操作对象的形式来操作数据库,提升效率的同时也能聚焦于业务开发。
从早期令人惊艳的ButterKnife,到后来的以ARouter为首的各种路由框架,再到现在谷歌大力推行的Jetpack组件,越来越多的第三方框架都在使用编译期注解这门技术,可以说不管你是想要深入研究这些第三方框架的原理 还是要成为一个Android高级开发工程师,编译期注解都是你不得不好好掌握的一门基础技术。
之前的例子中,关于url和Activity之间的关系,是写死在一个Map中的,可以看做是一个静态路由。随着项目规模的扩大,这样一个个的手写那张表是个工作量比较大的工作,那么有什么简单的方式可以实现自动化呢?
前言 话说我们做程序员的,都应该多少是个懒人,我们总是想办法驱使我们的电脑帮我们干活,所以我们学会了各式各样的语言来告诉电脑该做什么——尽管,他们有时候也会误会我们的意思。 突然有一天,我觉得有些代码其实,可以按照某种规则生成,但你又不能不写——不是所有的重复代码都可以通过重构并采用高端技术比如泛型来消除的——比如我最痛恨的代码: TextView textView = (TextView) findViewById(R.id.text_view); Button button = (Button) fin
APT(Annotation Processing Tool)即注解处理器,是一种处理注解的工具.简单来说就是在编译期,根据代码中的注解依据相应的规则生成.java文件.
对于比特币、莱特币、以太币等加密数字货币大家应该不陌生了,最近一年ico在国内也是备受关注和争议。抛开这些单纯从技术角度看基于java的开源blockchain相关的项目的实现。我们知道比特币很多是用C++做的,作为Java如何与Blockchain平台进行交互?今天介绍三款比较流行和出名的由java实现的区块链相关调用技术及对应的github下载地址。
文章写的比较啰嗦,有些东西可以不看,因为想看懂框架, 想了解SSH或者SSM框架的设计原理和设计思路,又去重新看了一遍反射和注解, 然后看别人的博客说想要看懂框架得先看懂设计模式,于是遇到了动态代理这个大坑,写博客等于是对自己学习过程的一个回顾和总结
在Android开发中,APT(Annotation Processing Tool)是一种强大的工具,它可以让开发者在编译期间处理注解,生成额外的代码。通过APT,我们可以实现很多高级功能,比如自动生成代码、实现依赖注入、生成路由表等。本文将深入探讨APT的运用以及背后的原理。
领取专属 10元无门槛券
手把手带您无忧上云