如何调试编译时注解处理器AnnotationProcessor

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调试编译时注解处理器AnnotationProcessor相关的知识,希望对你有一定的参考价值。

ALU内含电路系统,易于输出端完成简单的普通运算和逻辑运算(比如加法和位元运算)。如果加法运算产生一个对该CPU处理而言过大的结果,在标志暂存器里可能会设置运算溢出(Arithmetic Overflow)标志。 参考技术A 过得去.主频3.0GHZ.如果你显卡内存都可以的话,玩大型游戏不成问题是一款性价比蛮高的CPU. 参考技术B

    First of all, download and install Maven, then download and install IntelliJ IDEA (referred to as IDEA from here on). (If you don't know how to use Windows CMD, here is a short tutorial for it, also: how to open the command prompt)

    Create a Maven project in IDEA without any Archetype. Then create some some package in src > main > java

    Create a Class which extends javax.annotation.processing.AbstractProcessor.

    Insert some minimal code, just to make it work. (Don't forget the Annotation at the top of the class declaration!)

    Assuming that the annotation full path is core.Factory, the code will look like

    @SupportedAnnotationTypes("core.Factory")
    public class MyProcessor extends AbstractProcessor
    Messager messager;

    @Override
    public void init(ProcessingEnvironment env)
    messager = env.getMessager();
    super.init(env);


    @Override
    public boolean process(Set<? extends TypeElement> annotations,       RoundEnvironment roundEnv)
    for (TypeElement te : annotations)
    for (Element e : roundEnv.getElementsAnnotatedWith(te))
    messager.printMessage(Diagnostic.Kind.NOTE, "Printing: " +   e.toString());
    return true;


    @Override
    public SourceVersion getSupportedSourceVersion()
    return SourceVersion.latestSupported();


    Create an annotation in the same package.

    public @interface Factory


    In the project there is probably a directory src > test > java, create there another package with the same name as the package you've created earlier. Then create a Class in it with a name ending with "Test" (for example: MyProcessorTest). Then annotate this class with the new annotation type you created earlier (@Factory).

    @Factory
    public class MyProcessorTest


    Now, for annotation processors to work, they have to have some file in META-INF. To achieve that, we'll use another annotation processor called autoservice. So in the pom.xml file insert it's dependency.

    <dependencies>
    <dependency>
    <groupId>com.google.auto.service</groupId>
    <artifactId>auto-service</artifactId>
    <version>1.0-rc2</version>
    </dependency>
    </dependencies>

    7.1 Side-note: For some reason, if I don't specify it explicitly, the Maven project uses Java 1.5. To force it to work with Java 1.8, insert this into the pom.xml file.

    <build>
    <plugins>
    <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.3</version>
    <configuration>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
    </plugin>
    </plugins>
    </build>

    Annotate our Processor Class with @AutoService(Processor.class).

    Now, we have to set up a remote debugger configuration in IDEA. To do that, go to Run > Edit Configurations, click on the green + button on the top left, select remote. Name it something like "mvnDebug", set the Host to localhost and the Port to 8000, press ok and it's good to go.

    Set a break point in the process method in our Processor.

    Open up the Windows command prompt, navigate to your projects directory, where the pom.xml resides. Then type in mvnDebug clean install.If everything has been set up right, it should say something like "Listening for transport dt_socket at address: 8000".

    Go back to IDEA and execute the mvnDebug configuration we've just made. If everything has been set up right, it should say something like "Connected to the target VM, address: 'localhost:8000', transport: 'socket'".

    Go back to the Command Prompt and if nothing is happening press some key to wake it up.

    If everything was set up right, IDEA will stop at the breakpoint, suspending javac's (the Java compiler) execution.

Android APT编译时技术 ( 编译时注解 和 注解处理器 依赖库 )





一、编译时注解和注解处理器



上一篇博客 【Android APT】编译时技术 ( ButterKnife 原理分析 ) 简单介绍了下编译时技术 , 并简单分析了 ButterKnife 的实现原理 ;


使用 ButterKnife 时会依赖两个库 ,

dependencies {
    implementation 'com.jakewharton:butterknife:10.2.3'
    annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
}

其中 com.jakewharton:butterknife:10.2.3编译时注解 , com.jakewharton:butterknife-compiler:10.2.3注解处理器 ;


当程序构建编译时, 处理依赖库依赖 , 发现依赖了 annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' 注解处理器 , 然后到 com.jakewharton:butterknife-compiler:10.2.3 注解处理器中查找相关的注解处理的类 ;

使用编译时技术 APT 时 , 一般将 注解 拆分成两个部分 , 一部分是使用的 编译时注解 , 另一部分是 注解处理器 ;





二、创建 编译时注解 和 注解处理器



使用 Android Studio 开发 Android 项目时 , 使用到编译时技术 , 都要用到 编译时注解注解处理器 ;


编译时注解注解处理器 一般都创建为 Java or Kotlin Library 类型的 Module ;


右键点击工程名 , 选择 " New / Module " 选项 ,

在这里插入图片描述


在弹出的 " Create New Module " 对话框中 , 这里选择 Module 的类型为 Java or Kotlin Library ;

在这里插入图片描述

设置依赖库名称 , 注意语言选择 Java ; 暂时不涉及 Kotlin 注解 ;
在这里插入图片描述


使用上述相同的方式 , 创建 annotation 编译时注解 依赖库annotation-compiler 注解处理器 依赖库 , 这两个 Module 的类型都是 " Java or Kotlin Library " ;

在这里插入图片描述





三、添加 编译时注解 和 注解处理器 依赖库依赖



在主应用 " app " 中 , 依赖上述 annotation 编译时注解 依赖库annotation-compiler 注解处理器 依赖库 ;

右键点击应用 , 选择 " Open Modules Settings " 选项 ,

在这里插入图片描述

在 " Project Structure " 对话框中选择 " Dependencies " 选项卡 , 选择主应用 " app " , 点击 " + " 按钮 , 选择添加 " Module Dependency " 依赖库 ,

在这里插入图片描述

annotation 编译时注解 依赖库annotation-compiler 注解处理器 依赖库 添加到主应用 " app " 的依赖中 ;

在这里插入图片描述

添加依赖完成 ;

在这里插入图片描述


点击 " OK " 按钮后 , 在 build.gradle 构建脚本中自动生成的依赖 :

dependencies {
    implementation project(path: ':annotation-compiler')
    implementation project(path: ':annotation')
}

注意 : 对于 annotation-compiler 注解处理器 依赖库 不能使用 implementation , 必须使用 annotationProcessor ,

dependencies {
    annotationProcessor project(path: ':annotation-compiler')
    implementation project(path: ':annotation')
}




四、博客资源



博客源码 :

以上是关于如何调试编译时注解处理器AnnotationProcessor的主要内容,如果未能解决你的问题,请参考以下文章

自定义Gradle plugin Java AnnotationProcessor 和 Kotlin Kapt 断点调试

Android APT编译时技术 ( 编译时注解 和 注解处理器 依赖库 )

Android APT编译时技术 ( 开发编译时注解 )

Java注解处理器

java--自定义注解(注解在编译时生效)

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