Java代码生成框架 |
您所在的位置:网站首页 › 代码框架生成 › Java代码生成框架 |
介绍
JavaPoet是用于生成.Java源文件的Java API。
当处理诸如注释处理或与元数据文件交互(例如,数据库模式、协议格式)时,源文件生成可能非常有用。通过生成代码,您消除了编写样板文件的需要,同时也保留了元数据的单一来源。 集成到项目中 com.squareup javapoet 1.11.0 代码生成 类 //生成类 TypeSpec helloWorld=TypeSpec.classBuilder("HelloWorld") .build(); //Java文件生成 JavaFile javaFile=JavaFile.builder("com.itcast.lyc",helloWorld).build(); try { //把文件内容写入到 窗口打印出来 javaFile.writeTo(System.out); } catch (IOException e) { e.printStackTrace(); }生成内容如下: package com.itcast.lyc; class HelloWorld { } 方法 普通的方法列子 //生成类构造器 TypeSpec.Builder helloWorldBuilder=TypeSpec.classBuilder("HelloWorld"); MethodSpec main=MethodSpec.methodBuilder("main")//方法的构造器 .addParameter(String[].class,"args")//添加参数 .returns(void.class)//添加返回值 .addStatement("$T.out.println($S)",System.class,"helloWorld")//添加内容 .addStatement("$T.out.println($L)",System.class,100L)//显示字符 .build(); TypeSpec helloWorld=helloWorldBuilder.addMethod(main).build(); //Java文件生成 JavaFile javaFile=JavaFile.builder("com.itcast.lyc",helloWorld).build(); try { //把文件内容写入到 窗口打印出来 javaFile.writeTo(System.out); } catch (IOException e) { e.printStackTrace(); }其中$T代表类的.class类,使用$T和adddStatement匹配能自动导入包,$S表示注入字符串,adddStatement的一种注入字符串格式的语法,会自动帮语句添加分号和换行符,另外还有$L表示数字类型。 生成代码如下: package com.itcast.lyc; import java.lang.String; import java.lang.System; class HelloWorld { void main(String[] args) { System.out.println("helloWorld"); System.out.println(100); } }方法添加代码的方式还有.addCode("asdasds;\n"),但是.addCode不会自动生成分号和换行,所以也不用,还可以这样写.addCode(CodeBlock.builder().addStatement("$S","|sdsad").build())。 控制流 JavaPoet为生成控制流,给我们提供了便利的API,比如,我们想生成如下内容: if (true){ System.out.println("ok"); }我们很难想像如果让我们自己打印{}括号带来的麻烦,所以JavaPoet在方法构造器中提供了beginControlFlow和endControlFlow。 MethodSpec main=MethodSpec.methodBuilder("main")//方法的构造器 .addParameter(String[].class,"args")//添加参数 .returns(void.class)//添加返回值 .addStatement("$T.out.println($S)",System.class,"helloWorld")//添加内容 .addStatement("$T.out.println($L)",System.class,100L)//显示字符 .beginControlFlow("if(true)")//控制流开始 .addStatement("$T.out.println($S)",System.class,"ok") .endControlFlow()//控制流结束 .build(); 抽象类 MethodSpec abstractMethon=MethodSpec.methodBuilder("testAbs") .addModifiers(Modifier.PUBLIC,Modifier.ABSTRACT) .build(); TypeSpec typeSpec=TypeSpec.classBuilder("TestAbs") .addModifiers(Modifier.PUBLIC,Modifier.ABSTRACT) .addMethod(abstractMethon) .build(); 接口类 MethodSpec abstractMethon=MethodSpec.methodBuilder("testInterfaces") .addModifiers(Modifier.PUBLIC,Modifier.ABSTRACT) .build(); TypeSpec typeSpec=TypeSpec.interfaceBuilder("TestInterfaces") .addModifiers(Modifier.PUBLIC) .addField(FieldSpec.builder(String.class,"ONLY_ONCE") .addModifiers(Modifier.PUBLIC,Modifier.STATIC,Modifier.FINAL) .initializer("$S","OKKK") .build()) //添加字段 .addMethod(abstractMethon) .build(); 构造方法 //构造方法 MethodSpec consructorMethod=MethodSpec.constructorBuilder() .addModifiers(Modifier.PUBLIC) .addParameter(Integer.class,"age")//参数 .addStatement("this.$N=$N","age","age")//添加样式代码$N表示当前类的引用 .build(); TypeSpec helloWorld= helloWorldBuilder .addMethod(main)//添加main方法 .addField(FieldSpec.builder(Integer.class,"age").addModifiers(Modifier.PRIVATE).build())//添加字段 .addMethod(consructorMethod)//添加构造方法 .build(); 添加参数 .addParameter(Integer.class,"age")//参数 ParameterizedTypeName parameterizedTypeNameMap=ParameterizedTypeName.get( ClassName.get(Map.class), ClassName.get(Integer.class), ParameterizedTypeName.get( ClassName.get(Class.class), WildcardTypeName.subtypeOf(ClassName.get(Object.class)) ) ); ParameterizedTypeName parameterizedTypeNameList=ParameterizedTypeName.get( ClassName.get(List.class), WildcardTypeName.subtypeOf(ClassName.get(Integer.class)) ); //添加带参数的方法 MethodSpec parmMethod=MethodSpec.methodBuilder("welomeBeiJing") .addParameter(String.class,"parm") .addParameter(ParameterSpec.builder(parameterizedTypeNameMap,"map").build()) .addParameter(ParameterSpec.builder(parameterizedTypeNameList,"list").build()) .build();最后生成效果: void welomeBeiJing(String parm, Map |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |