不过比较遗憾的是你不能修改已经存在的Java文件,比如在已经存在的类中添加新的方法,所以通过Java Annotation Tool只能通过辅助类的方式来实现View的依赖注入,这样会略微增加项目的方法数和类数...,所有的解析结果都会存放在targetClassMap中作为结果返回。...$L 这条语句来看,我们就知道为什么使 用BindView注解的 * 变量不能为private了 */ CodeBlock.Builder builder...这个时候就需要用到android-apt这个插件了,使用它有两个目的: 允许配置只在编译时作为注解处理器的依赖,而不添加到最后的APK或library 设置源路径,使注解处理器生成的代码能被Android...Studio正确的引用 这里把使用ButterKnife时android-apt的配置作为例子,在工程的build.gradle中添加android-apt插件 buildscript { repositories
当你在这个文件中新增一行配置时,内心是否心生抗拒,思考过这行配置是否可以不用人工来添加,让你从机械重复的劳动中解放出来呢?...TypeSpec、ParameterSpec、MethodSpec、CodeBlock、JavaFile都是JavaPoet提供的用于描述一个源文件元素的类。...在apt_compiler model 的build.gradle中,添加如下配置: dependencies { compile fileTree(dir: 'libs', include:...如果在某轮process处理中,process生成了新的java文件,则apt编译器会将新生成的java文件作为输入,然后收集到新的被注解的元素,直到不再产生新的文件后,process循环调用结束。...TypeSpec、ParameterSpec、MethodSpec、CodeBlock、JavaFile都是JavaPoet提供的用于描述一个源文件元素的类。
在之前的“Java中的屠龙之术:如何修改语法树”中,我们详细介绍了如何使用Javac源码提供的工具类来修改语法树。...主要和注解配合用来干掉那些重复的模板代码(如butterknife 和databinding所做的事情),当然你也可以使用这个技术让你的代码更加的炫酷。...下面由浅入深,循序渐进的说明用法 方法&控制流: 添加方法 addcode 和 addstatement 对与无需类引入的极简代码可以直接使用addCode MethodSpec main = MethodSpec.methodBuilder...就需要使用.addStatement来声明 更优雅的流控制 beginControlFlow 流开启 addStatement 处理语句 endControlFlow()流结束 如上面的用流改写就是 MethodSpec...方法 方法的修饰,如Modifiers.ABSTRACT MethodSpec flux = MethodSpec.methodBuilder("flux") .addModifiers(Modifier.ABSTRACT
MainActivity、layout都直接使用自动生成的,在activity_main.xml中给TextView添加一个id。...我们的目的是通过读取类中的自定义注解,生成相应的绑定视图的代码,这就需要一个生成java代码的库javapoet, squre出品,质量绝对上乘。...强烈建议读者先阅读javapoet的简单使用, 不然可能难以读懂接下来的代码。...(element,BindView.class); CodeBlock.Builder bindViewCodeBlockBuilder=CodeBlock.builder();...,这在生产环境中是完全不可用的。
\Anaconda3\envs\tensorflow-gpu\Lib\site-packages\tensorflow\python\keras 3、找到keras目录下的optimizers.py文件并添加自己的优化器...找到optimizers.py中的adam等优化器类并在后面添加自己的优化器类 以本文来说,我在第718行添加如下代码 @tf_export('keras.optimizers.adamsss') class...super(Adamsss, self).get_config() return dict(list(base_config.items()) + list(config.items())) 然后修改之后的优化器调用类添加我自己的优化器...# 传入优化器名称: 默认参数将被采用 model.compile(loss=’mean_squared_error’, optimizer=’sgd’) 以上这篇如何在keras中添加自己的优化器...(如adam等)就是小编分享给大家的全部内容了,希望能给大家一个参考。
java 类就涉及到了后边要说的 JavaPoet技术。...element, BindView.class, e); } } ...... ...... // 将builderMap中的数据添加到队列中...在继续往下分析前,先了解下 JavaPoet 中一些重要的类(这些类还有许多实用的方法哦): TypeSpec 表示类、接口、或者枚举声明 ParameterSpec 表示参数声明 MethodSpec...表示构造函数、方法声明 FieldSpec 表示成员变量,一个字段声明 CodeBlock 表示代码块,用来拼接代码 JavaFile 表示Java类的代码 有了一些基础概念后,继续看用 JavaPoet...表示代码块,用来完成view查找、赋值语句的拼接 // 相当于target.title = CodeBlock.Builder builder = CodeBlock.builder
Javapoet:是生成.java源文件的开源API github:https://github.com/square/javapoet 以生成一个HelloWrold.java文件为例: 1 package...,由此可以看到 Javapoet使用的是建造者设计模式。...在内部类Builder中应该有添加权限修饰符/注释/注解/变量等操作来构建一个类或者接口枚举 MethodSpec:A generated constructor or method declaration...并且这个Builder内部类中同样包括添加权限修饰符/注释/注解等方法,另外方法有返回值,参数 Comment 语句来构建一个方法 同样的原理,FieldSpec是对成员变量的声明,而且里面也有一个可以返回当前对象的...builder静态内部类,在这个builder中同样有添加注释注解访问修饰符等的操作,来构建一个变量。
PS:ButterKnife 使用了 JavaPoet 来生成 Java 源码。如果对 JavaPoet 不太熟悉,可以先阅读这篇文章 《javapoet——让你从重复无聊的代码中解放出来》 。...若校验通过之后,生成该 element 所在的类元素对应的 builder ,builder 中添加相应的 Field 绑定信息,最后添加到待 unbind 的序列中去。...MethodSpec createBindingConstructor(TypeName targetType, int sdk) { // 创建构造方法,方法修饰符为 public ,并且添加注解为...的形式,所以属性肯定是不能 private 的 CodeBlock.Builder builder = CodeBlock.builder() .add(...~~ 0x07 References 浅析ButterKnife 深入理解 ButterKnife,让你的程序学会写代码 公共技术点之 Java 注解 Annotation javapoet——让你从重复无聊的代码中解放出来
我:AbstractProcessor只能处理注解,然后根据注解通过javapoet生成一个新的java类。...在每一轮中,可以向处理器询问process在前一轮产生的源文件和类文件上找到的注释的子集。 第一轮处理的输入是工具运行的初始输入; 这些初始输入可以被视为虚拟第0轮处理的输出。...静态方法 MethodSpec.Builder initMethod = MethodSpec.methodBuilder("init") .addModifiers...缺点和总结 缺点:apt能做的事情还是比较有限的 javapoet只能新增一个类,而不能对当前类进行更改。...一部分abtest赋值的操作其实也可以用同样的方式去调整。 但是把有些东西一旦深入了,还是有很多难点和痛点需要我们去解决的。偶尔造个火箭其实也还蛮香的。
( 注解处理器获取被注解的节点 ) 博客中 声明了 支持的注解类型 , 并在 Activity 中使用了注解 , 在 注解处理器 中检测出来使用注解的 类节点 TypeElement ; 本篇博客中讲解...源代码 ; JavaPoet 项目 GitHub 地址 : https://github.com/square/javapoet 添加依赖库 : 在 Android Studio 项目中的 Module...下的 build.gradle 添加如下依赖库 , 即可使用 JavaPoet ; compile 'com.squareup:javapoet:1.13.0' 使用 JavaPoet 生成方法 :...方法 , 获取 Filer 对象 ; 在 AbstractProcessor 注解处理器的 process 中根据获取的注解 , 生成相关代码 ; 注解处理器 使用 JavaPoet 示例 : package...; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeSpec; import java.io.IOException
在该方案中,通常有个必备的三件套,分别是注解处理器 Processor,注册注解处理器 AutoService 和代码生成工具 JavaPoet。...简而言之,当我们写一个类时,其实是有固定结构的,JavaPoet 提供了生成这些结构的 api,举例如下: 类:TypeSpec.classBuilder() 构造器:MethodSpec.constructorBuilder...() 方法:MethodSpec.methodBuilder() 参数:ParameterSpec.builder() 属性:FieldSpec.builder() 程序片段:CodeBlock.builder...如: int id = R2.id.footer; 如果写代码是应付工作,如果工作是绩效驱动,这类问题完全不需要考虑。...但是,作为优秀的、有态度的、有情怀的开源框架,JakeWharton 和 ButterKnife 给了我们榜样,为了解决这个问题,butterknife-lint 工程应运而生。
fieldSpec = FieldSpec.builder(Servlet.class, "impl", Modifier.PRIVATE).build(); //将属性 添加到类中...()) //给方法添加语句 这里是给每个方法都加上了一个计算时间 .addStatement("long start...n") //添加执行语句 我们希望的执行语句是 执行传过来的接口的某个方法 //比如 impl.upload()...在这种场景中,proxy的用途就表现出来了。...()) //给方法添加语句 这里是给每个方法都加上了一个计算时间 .addCode
因为在 Android 开发的过程中, 泛型,反射,注解这些知识进场会用到,几乎所有的框架至少都会用到上面的一两种知识,如 Gson 就用到泛型,反射,注解,Retrofit 也用到泛型,反射,注解 。...总的来说,大概可以分为以下几步: 在编译的时候扫描注解,并做相应的处理,生成 java 代码,生成 Java 代码是调用 javapoet 库生成的。...,表示支持哪些类型的注解,支持哪些版本, 重写 process 方法,处理相关的注解,存进 Map 集合中 根据扫描到的注解信息(即 Map 集合),调用 javapoet 库生成 Java 代码。...javapoet 开生成代码的。...的形式,所以属性肯定是不能 private 的 CodeBlock.Builder builder = CodeBlock.builder() .add(
作者:悦跑圈技术团队 https://joyrun.github.io/2016/07/19/AptHelloWorld/ 越来越多第三方库使用apt技术,如DBflow、Dagger2、ButterKnife...Annotation处理器在处理Annotation时可以根据源文件中的Annotation生成额外的源文件和其它的文件(文件具体内容由Annotation处理器的编写者决定),APT还会编译生成的源文件和原来的源文件...AutoService 主要的作用是注解 processor 类,并对其生成 META-INF 的配置信息。 JavaPoet 这个库的主要作用就是帮助我们通过类调用的形式来生成代码。...extends TypeElement> annotations, RoundEnvironment roundEnv) { MethodSpec main = MethodSpec.methodBuilder...compile project(':annotation') apt project(':compiler') } 编译使用 在随意一个类添加@Test注解 @Test public class
一、简介 在现阶段的Android开发中,注解越来越流行起来,比如ButterKnife,Retrofit,Dragger,EventBus等等都选择使用注解来配置。...编译时注解的核心依赖APT(Annotation Processing Tools)实现,原理是在某些代码元素上(如类型、函数、字段等)添加注解,在编译时编译器会检查AbstractProcessor的子类...,并且调用该类型的process函数,然后将添加了注解的所有元素都传递到process函数中,使得开发人员可以在编译器进行相应的处理,例如,根据注解生成新的Java类,这也就是EventBus,Retrofit...下边我们将学习如何在Android Studio中通过编译时注解生成java文件。 二、概念 注解处理器是一个在javac中的,用来编译时扫描和处理的注解的工具。...你可以为特定的注解,注册你自己的注解处理器。 注解处理器可以生成Java代码,这些生成的Java代码会组成 .java 文件,但不能修改已经存在的Java类(即不能向已有的类中添加方法)。
import com.squareup.javapoet.JavaFile import com.squareup.javapoet.MethodSpec import com.squareup.javapoet.TypeSpec...如果在某个类中声明一个同伴对象, 那么只需要使用类名作为限定符就可以调用同伴对象的成员了, 语法与Java中调用类的静态方法、静态变量一样。...中添加 buildscript { repositories { jcenter() } dependencies { classpath...'com.neenbedankt.gradle.plugins:android-apt:1.8' } } 在app 模块目录下的build.gradle中添加 apply plugin:...Activity上,添加@RouterRule,它是编译时的注解。
在编译流程进入Processor前,APT会对整个Java源文件进行扫描,这样就会获取到 所有添加了的注解和对应被注解的类。...在process()中获取了添加了@Route的所有Element,然后调用parseRoutes()开始解析。...这里就要介绍 javepoet 这个库了: JavaPoet是一款可以自动生成Java文件的第三方依赖 简洁易懂的API,上手快 让繁杂、重复的Java文件,自动化生成,提高工作效率,简化流程 JavaPoet...ClassName,通过包名和类名生成的对象,在JavaPoet中相当于为其指定Class ParameterizedTypeName,通过MainClass和IncludeClass生成包含泛型的Class...的 loadInto 方法 MethodSpec.Builder loadIntoMethodOfGroupBuilder = MethodSpec.methodBuilder(
注解处理器以Java代码(或者编译过的字节码)作为输入,生成.java文件作为输出。 简单来说就是在编译期,通过注解生成.java文件。...,如package name、Activity名、变量类型、id等,通过StringBuilder一点一点拼出Java代码,每个对象分别代表一个对应的.java文件。...在Module的build.gradle中添加依赖 dependencies { implementation project(':apt-annotation') } 创建注解工具类BindViewTools...这种做法是比较麻烦的,还有一种更优雅的方式,那就是javapoet。...先添加依赖 dependencies { implementation 'com.squareup:javapoet:1.10.0' } 然后在ClassCreatorProxy中 public
JavaFile与typeBuilder都是JavaPoet中的类。...这里将我们上一期自定义的注解添加到set集合中即可。 process 到了本篇文章的核心,process用来生成与注解相匹配的方法代码。通过解析Class中定义的注解,生成与注解相关联的类。...它是JavaPoet中的类。 JavaPoet 由于直接使用JavaFileObject生成.java资源文件是非常麻烦的,所以推荐使用JavaPoet。...例如:@Keep TypeSpec.Builder -> addMethod: 添加方法 MethodSpec -> addParameter: 为方法添加参数类型与参数名 MethodSpec ->...最后分别向bindView方法中添加findViewById与setText代码块,同时将定义的方法添加到typeBuilder中。
JavaPoet 生成代码 ) 【Android 组件化】路由组件 ( 注解处理器参数选项设置 ) 【Android 组件化】路由组件 ( 构造路由表中的路由信息 ) 【Android 组件化】路由组件...Router_Group_app.java ; 一个模块中的路由表可能有多个 , 需要为若干路由表再生成一个 Root 表, 用于作为路由表的导航 ; 生成的 Root 表样式 : 其中 “app”...; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.ParameterSpec..., // 则截取第 0 和 第 1 个 "/" 之间的字符串作为分组名称 if (routeGroup == null || "".equals(routeGroup)...Java 源码 Module 模块中 , 使用注解生成的源码 , 都在对应模块的 " build\generated\ap_generated_sources\debug\out\ " 目录中 ; app
领取专属 10元无门槛券
手把手带您无忧上云