package com.example.javapoet; import com.squareup.javapoet.AnnotationSpec; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.FieldSpec; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.ParameterizedTypeName; import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; import java.util.Collections; import java.util.logging.LogRecord; import javax.lang.model.element.Modifier; /** * Intro: * Author: zhangxutong * E-mail: mcxtzhang@163.com * Home Page: http://blog.csdn.net/zxt0601 * Created: 2017/1/18. * History: */ public class TestJavaPoet { public static void main(String[] args) throws Exception { /* TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld") .addModifiers(Modifier.PUBLIC, Modifier.FINAL) .addMethod(whatsMyName("slimShady")) .addMethod(whatsMyName("eminem")) .addMethod(whatsMyName("marshallMathers")) .build(); JavaFile javaFile = JavaFile.builder("com.example.helloworld", helloWorld) .build(); javaFile.writeTo(System.out);*/ //normal class /* ClassName hoverboard = ClassName.get("com.mattel", "Hoverboard"); //list ClassName list = ClassName.get("java.util", "List"); ClassName arrayList = ClassName.get("java.util", "ArrayList"); //类型变量type var TypeName listOfHoverboards = ParameterizedTypeName.get(list, hoverboard); ClassName namedBoards = ClassName.get("com.mattel", "Hoverboard", "Boards"); MethodSpec beyond = MethodSpec.methodBuilder("beyond") .returns(listOfHoverboards) .addStatement("$T result = new $T<>()", listOfHoverboards, arrayList) .addStatement("result.add($T.createNimbus(2000))", hoverboard) .addStatement("result.add($T.createNimbus(\"2001\"))", hoverboard) .addStatement("result.add($T.createNimbus($T.THUNDERBOLT))", hoverboard, namedBoards) .addStatement("$T.selectionSort(result)", Collections.class) .addStatement("return result.isEmpty() ? $T.emptyList() : result", Collections.class) .build(); TypeSpec hello = TypeSpec.classBuilder("HelloWorld") .addMethod(beyond) .build(); JavaFile.builder("com.example.helloworld", hello) .addStaticImport(hoverboard, "createNimbus") .addStaticImport(namedBoards, "*") .addStaticImport(Collections.class, "*") .build() .writeTo(System.out);*/ /* MethodSpec flux = MethodSpec.constructorBuilder() .addModifiers(Modifier.PUBLIC) .addParameter(String.class, "greeting") .addStatement("this.$N = $N", "greeting", "greeting") .build(); TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld") .addModifiers(Modifier.PUBLIC) .addField(String.class, "greeting", Modifier.PRIVATE, Modifier.FINAL) .addMethod(flux) .build(); */ /* TypeSpec comparator = TypeSpec.anonymousClassBuilder("") .addSuperinterface(ParameterizedTypeName.get(Comparator.class, String.class)) .addMethod(MethodSpec.methodBuilder("compare") .addAnnotation(Override.class) .addModifiers(Modifier.PUBLIC) .addParameter(String.class, "a") .addParameter(String.class, "b") .returns(int.class) .addStatement("return a.length() - b.length()") .build()) .build(); TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld") .addMethod(MethodSpec.methodBuilder("sortByLength") .addParameter(ParameterizedTypeName.get(List.class, String.class), "strings") .addStatement("$T.selectionSort($N, $L)", Collections.class, "strings", comparator) .build()) .build();*/ MethodSpec logRecord = MethodSpec.methodBuilder("recordEvent") .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT) .addAnnotation(AnnotationSpec.builder(HeaderList.class) .addMember("value", "$L", AnnotationSpec.builder(Header.class) .addMember("name", "$S", "Accept") .addMember("value", "$S", "application/json; charset=utf-8") .build()) .addMember("value", "$L", AnnotationSpec.builder(Header.class) .addMember("name", "$S", "User-Agent") .addMember("value", "$S", "Square Cash") .build()) .addMember("name", "test") .build()) .addParameter(LogRecord.class, "logRecord") .returns(LogReceipt.class) .build(); //inner class ClassName className = ClassName.bestGuess("HelloWorld"); FieldSpec INSTANCE = FieldSpec.builder(className, "INSTANCE") .addModifiers(Modifier.PRIVATE, Modifier.STATIC) .initializer("new $T()", className) .build(); TypeSpec innerClass = TypeSpec.classBuilder("InnerClass") .addModifiers(Modifier.PRIVATE, Modifier.STATIC) .addField(INSTANCE) .build(); //getInstance method MethodSpec methodGetInstance = MethodSpec.methodBuilder("getInstance") .addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(className) .addStatement("return $N.INSTANCE", innerClass) .build(); ClassName contextClass = ClassName.get("android.content", "Context"); ClassName intentClass = ClassName.get("android.content", "Intent"); ClassName conponentNameClass = ClassName.get("android.content", "ComponentName"); MethodSpec jump = MethodSpec.methodBuilder("jump") .addModifiers(Modifier.PUBLIC) .addParameter(String.class, "context") .addParameter(String.class, "where") .addStatement("String clsFullName = routerMap.get(where)") .beginControlFlow("if (TextUtils.isEmpty(clsFullName))") // TODO: 2017/1/19 log statement .endControlFlow() .beginControlFlow("else") .addStatement("$T intent = new $T()", intentClass, intentClass) .addStatement("intent.setComponent(new $T(context.getPackageName(), clsFullName))", conponentNameClass) .addStatement("context.startActivity(intent)") // TODO: 2017/1/19 log statement .addStatement("String clsFullName = routerMap.get(where)") .endControlFlow() .build(); TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld") .addModifiers(Modifier.PUBLIC) //.addMethod(logRecord) .addMethod(methodGetInstance) .addMethod(jump) .addType(innerClass) .build(); JavaFile.builder("com.example.helloworld", helloWorld) .build() .writeTo(System.out); //importStaticReadmeExample(); } public static void importStaticReadmeExample() { ClassName hoverboard = ClassName.get("com.mattel", "Hoverboard"); ClassName namedBoards = ClassName.get("com.mattel", "Hoverboard", "Boards"); ClassName list = ClassName.get("java.util", "List"); ClassName arrayList = ClassName.get("java.util", "ArrayList"); TypeName listOfHoverboards = ParameterizedTypeName.get(list, hoverboard); MethodSpec beyond = MethodSpec.methodBuilder("beyond") .returns(listOfHoverboards) .addStatement("$T result = new $T<>()", listOfHoverboards, arrayList) .addStatement("result.add($T.createNimbus(2000))", hoverboard) .addStatement("result.add($T.createNimbus(\"2001\"))", hoverboard) .addStatement("result.add($T.createNimbus($T.THUNDERBOLT))", hoverboard, namedBoards) .addStatement("$T.selectionSort(result)", Collections.class) .addStatement("return result.isEmpty() ? $T.emptyList() : result", Collections.class) .build(); TypeSpec hello = TypeSpec.classBuilder("HelloWorld") .addMethod(beyond) .build(); JavaFile example = JavaFile.builder("com.example.helloworld", hello) .addStaticImport(hoverboard, "createNimbus") .addStaticImport(namedBoards, "*") .addStaticImport(Collections.class, "*") .build(); if ((example.toString()).equals("" + "package com.example.helloworld;\n" + "\n" + "import static com.mattel.Hoverboard.Boards.*;\n" + "import static com.mattel.Hoverboard.createNimbus;\n" + "import static java.util.Collections.*;\n" + "\n" + "import com.mattel.Hoverboard;\n" + "import java.util.ArrayList;\n" + "import java.util.List;\n" + "\n" + "class HelloWorld {\n" + " List<Hoverboard> beyond() {\n" + " List<Hoverboard> result = new ArrayList<>();\n" + " result.add(createNimbus(2000));\n" + " result.add(createNimbus(\"2001\"));\n" + " result.add(createNimbus(THUNDERBOLT));\n" + " selectionSort(result);\n" + " return result.isEmpty() ? emptyList() : result;\n" + " }\n" + "}\n")) { System.out.println("checks passed "); } else { System.out.println("checks failed"); } ; } private static MethodSpec whatsMyName(String name) { return MethodSpec.methodBuilder(name) .returns(String.class) .addStatement("return $S", name) .build(); } }