JavaPoet

2020-08-03:讲下代码生成器原理。

橙三吉。 提交于 2020-08-09 12:06:46
福哥答案2020-08-03: 此答案是根据mysql数据库生成某种语言的代码。 1.mysql涉及到的数据库的表 INFORMATION_SCHEMA.Tables INFORMATION_SCHEMA.Columns 2.读数据库的相关信息。 数据库信息: 属性:【连接字符串】,【数据库类型】(mysql,sqlite等等),【数据库名】,【描述】,表集合。 方法:加载表集合。 表信息: 属性:所在数据库,【表名称】,【表描述】,字段集合。 方法:加载字段集合、表名称转成符合某种语言规范的名称。 字段信息: 属性:所在表,【字段名称】,【序号】,【数据类型】,【数据长度】,【小数点位数】,【占用字节数】,【标识】,【主键】,【外键】,【是否为空】,【默认值】,【描述】。 方法:数据类型转换成某种语言类型、字段名称转成符合某种语言规范的名称。 3.生成model,dal,bll等代码,这里最好写成3个方法,比如genmodelcode方法,gendalcode方法,genbllcode方法。 ①.字符串拼接。 ②.采用模板库或者第三方库。比如golang的template模板引擎。比如java的JavaPoet。 4.代码生成注意事项。 ①代码生成一般要考虑【自动代码】部分和【手动代码】部分。 c#的partial非常方便的把一个类的自动代码和手动代码分散到两个不同的文件

Android组件化路由实践

我是研究僧i 提交于 2020-04-21 03:45:58
Android应用组件化各个组件页面之间要实现跳转使用路由是一个很好的选择。本文将实现一个比较轻量级的路由组件,主要涉及以下知识: Annotation (声明路由目标信息) AnnotationProcessor (处理注解) JavaPoet (生成Java文件) UriMatcher (匹配Uri) 本文将使用Java注解来实现一个简单的路由组件,主要从这几方面来讲解: 注解定义与使用 注解跳转服务 使用AnnotationProcessor处理注解、生成文件 Uri的匹配 安全参数 注解跳转服务的开发 由于使用AnnotationProcessor,所以整个路由可分为以下模块: lib-component-router (Android工程) lib-component-router-annotation (存放注解) lib-component-router-compiler (注解处理) 注解定义 由于我们的路由组件相对简单,主要定义以下注解: UriDestination (声明路由目标信息) DestinationUri (定义Uri路径) DestinationArgument (参数声明) 声明目标路由注解 @Retention(RetentionPolicy.SOURCE) @Target(ElementType.TYPE) public @interface

Java无可匹敌的变身装备,钢铁侠客的绝密味道

耗尽温柔 提交于 2020-02-27 13:59:23
以上几个工具包,有些是比较偏门的,但它们完成的功能却非常酷炫。不仅酷炫,而且非常有用。在领导们频繁开会,使用各种方法论探讨怎么管理文档,怎么自动化,怎么代码审查的时候,你就已经把功能完成了。 我讨厌写一些业务代码,不仅仅因为它们的原始意图不是我设计的,成功了是产品的功劳,失败了代码要背锅。一个重要的原因,就是重复的代码太多,一个复杂的业务逻辑要找到它的Bug,也要下一番“苦力”。这里说的真的是苦力,而不是脑力,说明了大部分是低劣的重复劳动。 所以随着在项目中有了话语权,我会特别善待这些可怜的同学们。一个问题,直到发现的时候,才发现它的低级,但中间的曲折,很少有人能看到,一个非技术出身的管理者对此就很难理解。职位越是高,就越关注整体的目标达成,对个体的感受却关注的很少,这不是一个好的现象。千里之堤,溃于蚁穴。普通研发的整体水平代表了公司的竞争力。哦哦哦,我竟然违背了精英主义论调。 扯远了。下面介绍几个开发中常用的工具包,可以在Java源文件、语法树、字节码之间进行转换。用好了它们,不仅仅能实现一些黑科技,还能大大提高我们的生产力。 1、JavaPoet 有时候,我们要做一些代码生成工具,需要生成一些Java类源文件。如果使用字符串去拼接的话,很容易拼的乱七八糟。为了解放双手,就可以使用工具JavaPoet进行方法或者代码块的构建。它还提供了占位符等一系列方便的操作

How to get a reference to Modifier.PUBLIC that can not be applied in builder in MethodSpec's methodBuilder for JavaPoet

喜欢而已 提交于 2020-01-25 03:36:09
问题 Attempting to implement the basic JavaPoet example (see below) in a Android ActivityWatcher class from LeakCanary: .addModifiers(Modifier.PUBLIC, Modifier.STATIC) The Modifier.PUBLIC and Modifier.STATIC, and the other .addModifiers statement produce the Android Studio error addModifiers (javax.lang.model.element.modifier...) in Builder can not be applied to (int, int) and the following gradle error: :Machine-android:compileDebugJava C:\AAAMachine\Machine-master\Machine-android\src\main\java

error: package generated.schema does not exist

喜夏-厌秋 提交于 2019-12-24 19:18:14
问题 In my Android Application I have an annotation processor which generates files using JavaPoet and places them under the package generated.schema. The files are generating correctly. Whenever I use the generated file like so GeneratedFile.someGeneratedMethod(); I get the following error: error: package generated.schema does not exist. But if I include the fully qualified class name instead of importing like so generated.schema.GeneratedFile.someGeneratedMethod(); the code compiles and runs

AnnotationProcessing - Generating Files at Each Round vs at Last Round

只谈情不闲聊 提交于 2019-12-22 05:49:12
问题 I was playing around with annotation processing and was unable to use generated files directly via an import in my code. Instead I had to prepend the generated class with its complete package. I posted a SO question error: package generated.schema does not exist. In the end I figured out the reason for this, turned out to be pretty simple, see my answer to the same post. Turned out the error was because I was generating the files at last round of processing, instead of anywhere in between. So

Generating static class initializer using javapoet [duplicate]

蓝咒 提交于 2019-12-11 13:07:45
问题 This question already has an answer here : How to add static section in to java class in javapoet (1 answer) Closed last year . Is it possible to generate static initializer using javapoet ? See an example of what I'm trying to generate below: class Foo { static int one = 1; static int two = 2; static int sum; static { sum = one + two; } } I tried adding static initializer as a constructor with static modifier: TypeSpec.classBuilder("Foo") .addField(FieldSpec.builder(int.class, "one",

夯实 Java 基础

核能气质少年 提交于 2019-12-06 14:10:39
不知道大家有没有一种感觉,当你想要了解某个知识点的时候,就会发现好多技术类 APP 或者公众号在推一些关于这个知识点的文章。也许这就是大数据的作用,这也说明总有人比你抢先一步。学习不能停滞,要不你就会被别人越落越远。 本文接着来回顾和总结 Java 基础中注解的知识点和简单的使用,同样本文将从以下几个方面来回顾注解知识: 注解的定义 注解的语法 源码级别的注解的使用 运行时注解的使用 编译时注解的使用 Android 预置的注解 注解的定义 注解(Annotation),也叫元数据。一种代码级别的说明。它是 JDK 1.5 以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等元素上。它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。 注解对于代码的运行效果没有直接影响 。 注解有许多用处,主要如下: 提供信息给编译器: 编译器可以利用注解来探测错误和警告信息 编译阶段时的处理: 软件工具可以用来利用注解信息来生成代码、Html 文档或者做其它相应处理。 运行时的处理: 某些注解可以在程序运行的时候接受代码的提取 如我们所熟知的依赖注入框架 ButterKnife 就是在编译阶段来生成 findViewById 的代码(文件)的,而我们所见过的 @Deprecated 就是提供信息给编辑器的

AnnotationProcessing - Generating Files at Each Round vs at Last Round

点点圈 提交于 2019-12-05 07:44:44
I was playing around with annotation processing and was unable to use generated files directly via an import in my code. Instead I had to prepend the generated class with its complete package. I posted a SO question error: package generated.schema does not exist . In the end I figured out the reason for this, turned out to be pretty simple, see my answer to the same post. Turned out the error was because I was generating the files at last round of processing, instead of anywhere in between. So my questions are: How does generating files at last round vs generating files at in between rounds

butterknife 10.1.0 核心源码分析

久未见 提交于 2019-12-05 01:58:17
项目结构 butterknife-runtime butterknife butterknife-annotations butterknife-compiler butterknife-gradle-plugin //以下是辅助 butterknife-integration-test butterknife-lint butterknife-reflect 项目依赖图: 如何使用: 1.先在项目根路径 build.gradle 里添加 classpath 'com.jakewharton:butterknife-gradle-plugin:10.1.0' 2.在app module build.gradle 里添加 dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation 'com