日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【错误记录】Android 编译时技术报错 ( 注解处理器 process 方法多次调用问题 )

發布時間:2025/6/17 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【错误记录】Android 编译时技术报错 ( 注解处理器 process 方法多次调用问题 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、報錯信息
  • 二、問題分析
  • 三、解決方案


注解處理器 AbstractProcessor 中的 process 方法可能會調用多次 , 在生成代碼時 , 一定要注意 , 檢測到 注解節點 后再生成代碼 ;





一、報錯信息



Android 編譯時技術 , 使用注解處理器生成代碼 , 編譯時報如下錯誤 :

( 該錯誤不會中斷編譯 )

javax.annotation.processing.FilerException: Attempt to recreate a file for type com.example.helloworld.HelloWorldat com.sun.tools.javac.processing.JavacFiler.checkNameAndExistence(JavacFiler.java:522)at com.sun.tools.javac.processing.JavacFiler.createSourceOrClassFile(JavacFiler.java:396)at com.sun.tools.javac.processing.JavacFiler.createSourceFile(JavacFiler.java:378)at com.squareup.javapoet.JavaFile.writeTo(JavaFile.java:169)at kim.hsl.router_compiler.RouterProcessor.process(RouterProcessor.java:91)at org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.process(DelegatingProcessor.java:62)at org.gradle.api.internal.tasks.compile.processing.NonIncrementalProcessor.process(NonIncrementalProcessor.java:45)at org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.process(DelegatingProcessor.java:62)at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.access$401(TimeTrackingProcessor.java:37)at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$5.create(TimeTrackingProcessor.java:99)at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$5.create(TimeTrackingProcessor.java:96)at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.track(TimeTrackingProcessor.java:117)at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.process(TimeTrackingProcessor.java:96)at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)at com.sun.tools.javac.main.Main.compile(Main.java:523)at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)at org.gradle.internal.compiler.java.IncrementalCompileTask.call(IncrementalCompileTask.java:74)





二、問題分析



根據上述報錯信息提示 " Attempt to recreate a file " , 嘗試重新創建一個文件 , 也就是說之前已經創建了一次文件 ;

注解處理器代碼如下 :

package kim.hsl.router_compiler;import com.google.auto.service.AutoService; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeSpec;import java.io.IOException; import java.util.Set;import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Filer; import javax.annotation.processing.Messager; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.Processor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic;// 自動注冊注解處理器 @AutoService(Processor.class) // 支持的注解類型 @SupportedAnnotationTypes({"kim.hsl.router_annotation.Route"}) // 支持的 Java 版本 @SupportedSourceVersion(SourceVersion.RELEASE_8) public class RouterProcessor extends AbstractProcessor {/*** 注解處理器中使用 Messager 對象打印日志*/private Messager mMessager;/*** 用于寫出生成的 Java 代碼*/private Filer mFiler;/*** 該函數在初始化時調用 , 相當于構造函數* @param processingEnvironment*/@Overridepublic synchronized void init(ProcessingEnvironment processingEnvironment) {super.init(processingEnvironment);// 獲取打印日志接口this.mMessager = processingEnvironment.getMessager();mMessager.printMessage(Diagnostic.Kind.NOTE, "Messager Print Log");this.mFiler = processingEnvironment.getFiler();}/*** 該函數在注解處理器注冊時自動執行, 是處理注解的核心函數** Set<? extends TypeElement> set 參數 : 該集合表示使用了相關注解的節點的集合** @param set* @param roundEnvironment* @return*/@Overridepublic boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {for (TypeElement typeElement: set){mMessager.printMessage(Diagnostic.Kind.NOTE, "SupportedAnnotationTypes : " + typeElement.getQualifiedName());}// 生成 public static void main(String[] args) 函數MethodSpec main = 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();// 指定 public final class HelloWorld 類TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld").addModifiers(Modifier.PUBLIC, Modifier.FINAL).addMethod(main).build();// 正式在 "com.example.helloworld" 包名下創建 HelloWorld 類JavaFile javaFile = JavaFile.builder("com.example.helloworld", helloWorld).build();try {javaFile.writeTo(mFiler);} catch (IOException e) {e.printStackTrace();}return false;} }

在 process 方法中 , 使用 JavaPoet 生成 Java 代碼 ;

上述 process 方法應該是調用 333 次 , 調用第一次時生成了 com.example.helloworld.HelloWorld 源碼 , 但是后面又調用了 222 次 , 后面調用的 222 次直接報上述 " javax.annotation.processing.FilerException: Attempt to recreate a file for type com.example.helloworld.HelloWorld " 錯誤 ;





三、解決方案



AbstractProcessor 中的 process 方法調用了 333 次 , 但是只有 111 次 Set<? extends TypeElement> set 注解參數不為空 , 這里檢測到注解后 , 再生成 Java 代碼即可 ;


修改后的源代碼如下 :

package kim.hsl.router_compiler;import com.google.auto.service.AutoService; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeSpec;import java.io.IOException; import java.util.Set;import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Filer; import javax.annotation.processing.Messager; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.Processor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic;// 自動注冊注解處理器 @AutoService(Processor.class) // 支持的注解類型 @SupportedAnnotationTypes({"kim.hsl.router_annotation.Route"}) // 支持的 Java 版本 @SupportedSourceVersion(SourceVersion.RELEASE_8) public class RouterProcessor extends AbstractProcessor {/*** 注解處理器中使用 Messager 對象打印日志*/private Messager mMessager;/*** 用于寫出生成的 Java 代碼*/private Filer mFiler;/*** 該函數在初始化時調用 , 相當于構造函數* @param processingEnvironment*/@Overridepublic synchronized void init(ProcessingEnvironment processingEnvironment) {super.init(processingEnvironment);// 獲取打印日志接口this.mMessager = processingEnvironment.getMessager();mMessager.printMessage(Diagnostic.Kind.NOTE, "Messager Print Log");this.mFiler = processingEnvironment.getFiler();}/*** 該函數在注解處理器注冊時自動執行, 是處理注解的核心函數** Set<? extends TypeElement> set 參數 : 該集合表示使用了相關注解的節點的集合** @param set* @param roundEnvironment* @return*/@Overridepublic boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {for (TypeElement typeElement: set){mMessager.printMessage(Diagnostic.Kind.NOTE, "SupportedAnnotationTypes : " + typeElement.getQualifiedName());// 生成 public static void main(String[] args) 函數MethodSpec main = 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();// 指定 public final class HelloWorld 類TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld").addModifiers(Modifier.PUBLIC, Modifier.FINAL).addMethod(main).build();// 正式在 "com.example.helloworld" 包名下創建 HelloWorld 類JavaFile javaFile = JavaFile.builder("com.example.helloworld", helloWorld).build();try {javaFile.writeTo(mFiler);} catch (IOException e) {e.printStackTrace();}}return false;} }

修改后 , 編譯時不再報上述錯誤 ;

總結

以上是生活随笔為你收集整理的【错误记录】Android 编译时技术报错 ( 注解处理器 process 方法多次调用问题 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人性生生活性生交全黄 | 蜜桃网站| 黄视频在线观看免费 | 日本伦理在线 | 国产二区免费 | 日韩精品无码一区二区 | 69久人妻无码精品一区 | 91嫩草精品| 婷婷中文字幕在线 | 337p日本大胆噜噜噜噜 | 河北彩花69xx精品一区 | 91视频官网 | 欧美 日韩 国产 激情 | 日韩三级黄色片 | 久久精品一区二区三 | 日本人六九视频 | 69视频污 | 欧洲mv日韩mv国产 | 国产欧美一级片 | 国内av片 | 蜜桃无码一区二区三区 | 欧美成人激情视频 | 琪琪午夜伦理影院7777 | 性色一区二区 | 黄色三级网络 | 激情小说一区 | 好吊色一区二区 | 性插免费视频 | 成人免费观看视频网站 | 一区二区三区四区五区在线视频 | 欧美激情一区二区三区四区 | 国产在线视频你懂的 | 日韩有码av | 国产婷婷色综合av蜜臀av | 小情侣高清国产在线播放 | 亚洲av无码国产精品久久不卡 | 日韩在线不卡一区 | 色呦呦免费观看 | 日韩视频中文 | 精品久久久中文字幕人妻 | 可以免费观看av | 四虎国产精品永久免费观看视频 | jlzzjlzz亚洲女人18 | 午夜黄色网址 | 天天干夜夜夜 | 射精一区二区 | 久草午夜 | 久久夜色精品国产欧美乱极品 | 亚洲第一国产 | 亚洲视频在线观看免费视频 | 久久综合色88 | 伊人22综合 | 九九人人| 国产精品天天看 | 五月天av在线 | 伊人精品一区二区三区 | 夜色在线视频 | 精品动漫一区二区三区在线观看 | 欧美一区二区激情 | 亚州av综合色区无码一区 | 久久久久美女 | 欧美黄色免费观看 | 亚洲经典av | 日日摸日日碰夜夜爽av | 亚洲熟妇无码av在线播放 | 17c精品麻豆一区二区免费 | 国产群p视频| 成人在线免费观看视频 | 黄色一几片 | 国产精品无码粉嫩小泬 | 国产精品美女久久久 | 国产二级毛片 | 中文字幕av专区dvd | 国产丰满大乳奶水在线视频 | 国产91大片 | 国产精品午夜视频 | 97久久久久久久久久 | 美日韩中文字幕 | 免费特黄视频 | 欧美xxx视频 | 极品色av影院 | 人人玩人人干 | 中国极品少妇videossexhd 就要干就要操 | 欧美精品18 | 亚洲久久在线观看 | 色播激情 | 国产3p露脸普通话对白 | 69久久精品无码一区二区 | 丝袜一区二区三区 | 2023天天操 | 国产成人激情视频 | 免费人成在线观看网站 | 自拍偷拍欧美激情 | 在线观看国产网站 | 中文字幕成人在线观看 | 狠狠操天天干 | 成年人福利网站 | 四虎永久免费影院 | 欧美人与性动交xxⅹxx |