# AptDemo **Repository Path**: bear_android/AptDemo ## Basic Information - **Project Name**: AptDemo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-12-10 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Apt + JavaPoet ## APT 步骤 1. 创建java lib annotation 和 compiler 2. 创建依赖关系 ```java // ---- compiler ---- // 谷歌的服务 compileOnly 'com.google.auto.service:auto-service:1.0-rc6' annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6' // 注解项目 implementation project(':annotation') // 控制台中文乱码的问题 tasks.withType(JavaCompile){ options.encoding = "UTF-8" } // ---- app ---- implementation project(':annotation') annotationProcessor project(':compiler') ``` 3. 创建注解类 ```java // ---- annotation ---- @Target(ElementType.TYPE) @Retention(RetentionPolicy.CLASS) public @interface ARouter { String path(); } ``` 4. 创建注解执行类 ```java @AutoService(Processor.class) // 接收的类型 @SupportedAnnotationTypes({Constants.AROUTER_ANNOTATION_TYPES}) // JDK的版本 @SupportedSourceVersion(SourceVersion.RELEASE_7) public class ARouterProcessor extends AbstractProcessor { // 操作Element工具类 private Elements elementsUtils; // 打印日志 private Messager messager; // 文件生成器 private Filer filer; @Override public synchronized void init(ProcessingEnvironment processingEnvironment) { super.init(processingEnvironment); // 初始化工作 elementsUtils = processingEnvironment.getElementUtils(); messager = processingEnvironment.getMessager(); filer = processingEnvironment.getFiler(); } // 可以用注解来代替 // @Override // public Set getSupportedAnnotationTypes() { // return super.getSupportedAnnotationTypes(); // // 支持的注解类型 // } // // @Override // public SourceVersion getSupportedSourceVersion() { // return super.getSupportedSourceVersion(); // // 支持的JDK版本 // } // // // @Override // public Set getSupportedOptions() { // return super.getSupportedOptions(); // // 接受参数 // } @Override public boolean process(Set set, RoundEnvironment roundEnvironment) { if(set.isEmpty()) return false; // 获取所有带有ARouter注解的类节点 Set elements = roundEnvironment.getElementsAnnotatedWith(ARouter.class); for(Element element:elements){ // 通过类节点,获取包节点全路径名 String packageName = elementsUtils.getPackageOf(element).getQualifiedName().toString(); // 获取简单类名 String className = element.getSimpleName().toString(); messager.printMessage(Diagnostic.Kind.NOTE,"备注解的类:"+className); // 最终生成类的名称 String finalClassName = className + "$$ARouter"; try{ JavaFileObject sourceFile = filer.createSourceFile(packageName+"."+finalClassName); Writer writer = sourceFile.openWriter(); writer.write("package "+packageName+";\n"); writer.write("import android.util.Log;\n"); writer.write("public class "+finalClassName+" {\n"); writer.write("public void hello (String path){\n"); writer.write("Log.d(\"aaa\",\"path:\"+path);\n"); writer.write("}\n"); writer.write("}\n"); writer.close(); }catch (IOException e){ e.printStackTrace(); } } return true; } } ``` ## Java Poet 1. 第一二三步同上 2. 第四步 ```java // 创建了一个main方法案例 public void parseElements(Set elements) throws IOException{ // 方法 MethodSpec mainMethod = MethodSpec.methodBuilder("main") .addModifiers(Modifier.PUBLIC,Modifier.STATIC) .returns(void.class) .addParameter(String[].class,"args") .addStatement("$T.out.println($S)",System.class,"Hello JavaPoet") .build(); // 类 TypeSpec helloWorld = TypeSpec.classBuilder("Hello$$world") .addModifiers(Modifier.PUBLIC,Modifier.FINAL) .addMethod(mainMethod) .build(); // 文件生成器 JavaFile javaFile = JavaFile.builder("com.chamei.builder",helloWorld) .build(); javaFile.writeTo(filer); messager.printMessage(Diagnostic.Kind.NOTE,"文件生成结束>>>>>>>>>>>>>"); } ```