我们在开发Android或者Web项目时,经常会使用一些工具的快捷方式,或者一些三方开源包,自动生成Java源码,比如定义Bean/POJO时,会自动生成Get/Set toString方法等,或者使用GreenDAO会自动产生DAO工具类,ARouter生成路由表。这些是怎么做到的,其实关于Android这块,就是利用Java代码的序列化,将内存数据按Java的规则,生成对应Java文件。工具类的还没研究,这个mark一下,以后学习。
这篇就是说明Andorid里面这些开源包是怎么生成Java文件的,它们都是利用JavaPoet开源库,加上一些编译工具组合一起,生成Java代码的。JavaPoet的开源代码库就在这里:https://github.com/square/javapoet,我们这里仅分析JavaPoet如何做到将我们自己代码里面的String变化成Java文件代码。
我们先分析一下Java文件里面的内容:
先是Type,Method,Parameter,Field这几个,Type就是类型名称,比如我们的类名,它有修饰符和名称,方法,Mehtod就是一个方法,也有修饰符和名称,还有返回值,方法参数。Parameter就是参数,函数的参数类型,修饰符,名称。Field就是我们类里面的成员变量。这几个分别对应的就是JavaPoet里面的Spec类,然后和JavaFile一起组合成一个Java类文件,进行IO文件输出,就能生成我们需要的Java代码。
另外如果我们要动态生成Java代码时,可以先将结果写出,然后依照结果和具体的业务,生成对应的Spec类,跟JavaFile一起组合成一个Java类,输出成一个Java文件。
关于前面说的“加上一些编译工具”,这个后面有篇幅介绍,一步步来。
最后我们也要经常思考,不然不能很好的找到学习的方向,有了问题,我们才知道后面需要学习什么。思考几个问题:
1.哪些地方用了JavaPoet?
2.还有哪些Java序列化方法,各有什么优势?
3.JavaPoet适合用在哪些情况下?
4.Java动态代理是如何做到的?