一、介绍

  JavaPoet项目可以动态的生成Java文件,这是一个很强大和很动态的方法,使用注解的时候假如需要生成新的Java文件就可以通过这个开源项目实现。
  项目地址:https://github.com/square/javapoet

二、JavaPoet常用的类

  MethodSpec 代表一个构造函数或方法声明。
  TypeSpec 代表一个类、借口或者枚举声明。
  FieldSpec 代表一个成员变量,一个字段声明。
  JavaFile 包含一个顶级类的Java文件。

三、引入开源项目

  compile 'com.squareup:javapoet:1.8.0'

  也可以在开源项目处找到jar文件,下载下来,引入到项目中。

四、生成一个函数

  生成一个件简单的HelloWorld类,有一个静态方法,只是简单的输出“Hello World”字符串。

package com.zhangmiao;
import javax.lang.model.element.Modifier; import com.squareup.javapoet.*; import java.io.File;
import java.io.IOException;
import java.lang.System; public class MainClass { /**
* @param args
*
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MainClass mainClass = new MainClass();
mainClass.generateHelloWord(); } private void generateHelloWord(){
MethodSpec main = MethodSpec.methodBuilder("show")
.addModifiers(Modifier.PUBLIC,Modifier.STATIC)
.addStatement("$T.out.println($S)",System.class,"Hello World!")
.build();
TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")
.addModifiers(Modifier.PUBLIC)
.addMethod(main)
.build(); JavaFile javaFile = JavaFile.builder("com.zhangmiao", helloWorld).build();
File outputFile = new File("src/"); //输出文件 try {
javaFile.writeTo(outputFile);
javaFile.writeTo(System.out);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

  运行结果会显示整个类的内容,运行MainClass之后,选择项目点击右键,运行Refresh之后,就可以在包下看到HelloWorld.java类了。

五、调用HelloWorld类的show方法

package com.zhangmiao;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; public class test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class hello = Class.forName("com.zhangmiao.HelloWorld");
hello.newInstance();
Method method = hello.getMethod("show", null);
method.invoke(null, null);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Class Not Found");
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
System.out.println("No Such Method");
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

  运行test之后,可以看到运行show方法的结果,打印"Hello World"字符串。

六、注意事项

我的代码是使用MyEcplise写的,jdk的版本需要是jdk1.7,如果不是1.7,代码运行就会报如下错误:

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/squareup/javapoet/MethodSpec : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at MainClass.main(MainClass.java:13)

这个时候就需要将jdk的版本修改为1.7。
jdk1.7下载地址:http://download.csdn.net/download/chun201010/7824469
MyEcplise配置jdk1.7请参考另外一篇文章:http://www.cnblogs.com/zhangmiao14/p/6932330.html

还有一些其他生成类和方法的方法,比如for循环的写法,直接使用addCode()方法生成方法内容,设置返回值、参数等等,这些细节可以参考源码地址的README.md文件,很详细,本文只是简单的使用一下。

JavaPoet开源项目的使用的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  4. iOS开源项目周报0105

    由OpenDigg 出品的iOS开源项目周报第四期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. He ...

  5. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

  6. .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来

    从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...

  7. .NET平台开源项目速览(16)C#写PDF文件类库PDF File Writer介绍

    1年前,我在文章:这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)中(第9个项目),给大家推荐了一个开源免费的PDF读写组件 PDFSharp,PDFSharp我2年前就看过 ...

  8. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  9. .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper

    好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...

随机推荐

  1. 有关在Eclipse中安装STS(Spring Tool Suite)的若干问题总结

    1.之前说明 在网上找了很多安装的方法,每次在线安装总会出现各种各样的问题,本地安装也是出现同样的问题(后来发现是下载的包有问题) 还有其他问题(忘记截图了,上图来自网络),大概就是这些各种各样的错误 ...

  2. JS学习记录------JS基本指令

    对未来的恐慌,和想成为一名自由开发的梦想.让我觉得应该点亮一个新的技能:WEB前端开发. 重新学习JS以及jQuery,让我在日常code的过程中可以更得心应手,毕竟,我爱代码. 这篇文章主要记录的内 ...

  3. Posche Piwis 3 Original and Clone – What’s the difference

    Category : Car Diagnostic Tools What’s the difference between Porsche Tester Piwis III original and ...

  4. python中的列表及numpy数组排序

    一.列表排序  # python中对列表排序有sort.sorted两种方法,其中sort是列表内置方法,其帮助文档如下:In [1]: help(sorted) Help on built-in f ...

  5. pyadb关于python操作adb的资料

    3.最后adb命令由于是android的原生操作命令,支持实现的功能非常多.这里举几个pyapp里实现的功能例子:获取,修改手机当前使用的输入法(adb shell ime list),获取当前手机界 ...

  6. GUI学习之七——单选框QRadioButton和QButtonGroup的学习总结

    一.单选框QRadioButton的使用 1.类的描述 a.单选框按钮用于给用户提供若干选项中的单选操作,当一个被选中时,会自动取消选中的那个.(如果只有一个时可以通过单击该按钮改变其状态:而存在多个 ...

  7. 《Miracle-House团队》项目需求分析改进

    (一)团队项目需求分析改进 一.<西小餐项目需求规格说明书>的不足 通过老师和其他同学的指正和建议,我们发现上次的需求规格说明书存在以下不足: 1.需求规格文档不够完整和规范: 2.系统设 ...

  8. Find them, Catch them POJ - 1703

    题意:N个人,M次操作,操作一:A X Y,X,Y不是同一帮派,操作二:D X Y,判断X和Y的关系. 思路:如果X和Y不是同一帮派,那X与Y+N.Y与X+N是同一帮派,如果X与Y不在同一帮派且X与Y ...

  9. NOIP刷题建议(未完结)

    1NOIP提高组真题 2NOI部分题目 为什么要写这个? 主要是一个人在硕大的机房里打(wan)代(you)码(xi),没多少时间了,所以打算来总结一下. 这个也是为我接下来冲刺做一个准备. 这个会不 ...

  10. Vue history模式支持ie9

    vue 路由里面的history能让浏览器显示平常一样的链接,可以去掉#这种,但是在ie9下面会强制变成hash,因为history不支持ie9自动降级,可能就会影响美感,解决:可以在路由里面添加fa ...