如何在 MethodSpec 的 methodBuilder for JavaPoet 中获取无法在构建器中应用的 Modifier.PUBLIC 的引用

How to get a reference to Modifier.PUBLIC that can not be applied in builder in MethodSpec's methodBuilder for JavaPoet

正在尝试在来自 LeakCanary 的 Android ActivityWatcher class 中实现基本的 JavaPoet 示例(见下文):

.addModifiers(Modifier.PUBLIC, Modifier.STATIC)

Modifier.PUBLIC 和 Modifier.STATIC 以及其他 .addModifiers 语句产生 Android Studio 错误

addModifiers (javax.lang.model.element.modifier...) in Builder can not be applied to (int, int)

和以下 gradle 错误:

:Machine-android:compileDebugJava

C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\ActivityWatcher.java:58: 错误: 无法访问修饰符 .addModifiers(Modifier.PUBLIC, Modifier.STATIC) ^ 找不到 javax.lang.model.element.Modifier 的 class 文件 C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\ActivityWatcher.java:65: 错误:class Builder 中的方法 addModifiers 无法应用于给定类型; .addModifiers(Modifier.PUBLIC, Modifier.FINAL) ^ 要求:修饰符[] 发现:整数,整数 原因:可变参数不匹配; int 不能转换为 Modifier C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\ActivityWatcher.java:73: 错误: 无法访问 Filer javaFile.writeTo(System.out); ^ class 找不到 javax.annotation.processing.Filer 的文件 C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\ActivityWatcher.java:172: 错误:class Builder 中的方法 addModifiers 无法应用于给定类型; .addModifiers(Modifier.PUBLIC, Modifier.STATIC) ^ 要求:修饰符[] 发现:整数,整数 原因:可变参数不匹配; int 不能转换为 Modifier C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\ActivityWatcher.java:179: 错误:class Builder 中的方法 addModifiers 无法应用于给定类型; .addModifiers(Modifier.PUBLIC, Modifier.FINAL) ^ 要求:修饰符[] 发现:整数,整数 原因:可变参数不匹配; int 不能转换为 Modifier C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\ActivityWatcher.java:187: 错误: 无法访问路径 javaFile.writeTo(System.out); ^ 找不到 java.nio.file.Path 的 class 文件 注意:C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\internal\MachineInternals.java 使用或覆盖已弃用的 API。 注意:使用 -Xlint:deprecation 重新编译以获取详细信息。 注意:一些消息已被简化;使用 -Xdiags:verbose 重新编译以获得完整输出 6 个错误

失败

失败:构建失败,出现异常。

构建失败

总时间:6.881 秒

这是来自消息的错误:

:machine-android:compileDebugJava

C:\AAAmachine\machine-master\machine-android\src\main\java\com\bmp\ActivityWatcher.java Error:(58, 15) 错误:无法访问修改器 找不到 javax.lang.model.element.Modifier 的 class 文件 Error:(65, 15) 错误:class Builder 中的方法 addModifiers 无法应用于给定类型; 要求:修饰符[] 发现:整数,整数 原因:可变参数不匹配; int 不能转换为 Modifier Error:(73, 19) 错误:无法访问 Filer class 找不到 javax.annotation.processing.Filer 的文件 Error:(172, 15) 错误:class Builder 中的方法 addModifiers 无法应用于给定类型; 要求:修饰符[] 发现:整数,整数 原因:可变参数不匹配; int 不能转换为 Modifier 错误:(179, 15) 错误:class Builder 中的方法 addModifiers 无法应用于给定类型; 要求:修饰符[] 发现:整数,整数 原因:可变参数不匹配; int 不能转换为 Modifier Error:(187, 19) 错误:无法访问路径 找不到 java.nio.file.Path 的 class 文件 注意:C:\AAAmachine\machine-master\machine-android\src\main\java\com\bmp\internal\machineInternals.java 使用或覆盖已弃用的 API。 注意:使用 -Xlint:deprecation 重新编译以获取详细信息。 注意:一些消息已被简化;使用 -Xdiags:verbose 重新编译以获得完整输出 Error:Execution 任务 ':machine-android:compileDebugJava' 失败。

Compilation failed; see the compiler error output for details. Information:BUILD FAILED Information:Total time: 6.881 secs Information:7 errors Information:0 warnings Information:See complete output in console

下面是使用来自 JavaPoet readme.md 文件的基本示例的源代码要点:

package com.bmp;

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.ViewGroup;

import com.bmp.util.eventbus.FabricLogEvent;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Modifier;

import de.greenrobot.event.EventBus;

import static android.os.Build.VERSION.SDK_INT;
import static android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;
import static com.bmp.Preconditions.checkNotNull;



@TargetApi(ICE_CREAM_SANDWICH) public final class ActivityWatcher {

    public static void installOnIcsPlus(Application application, RefWatcher refWatcher) {
        if (SDK_INT < ICE_CREAM_SANDWICH) {
          // If you need to support Android < ICS, override onDestroy() in your base activity.
          return;
        }

    ActivityWatcher activityWatcher = new ActivityWatcher(application, refWatcher);
    activityWatcher.watchActivities();

    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();

    TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")
            .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
            .addMethod(main)
            .build();

    JavaFile javaFile = JavaFile.builder("com.bmp.helloworld", helloWorld)
            .build();

    try {
        javaFile.writeTo(System.out);
    } catch (IOException e) {
        e.printStackTrace();
    }

    FileWriter fileWriter = null;
    try {
        fileWriter = new FileWriter(new File("com.bmp.newclass.java"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

会不会和写入的物理文件名有关?

将导入更改为 import javax.lang.model.element.Modifier。如果您无法导入此包,请将项目的模块配置从 Android SDK 更改为 Java SDK。

在您的 Android 项目中,创建一个 Java 模块供代码使用 JavaPoet.
成功为

在此模块中,您的 build.gradle 文件应如下所示:

apply plugin: 'java'

sourceCompatibility = "1.7"
targetCompatibility = "1.7"
dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  compile 'com.squareup:javapoet:1.7.0'
}

.

我觉得这个方法可行

这只是 Android 工作室错误。 Android 工作室代码检查错误。 将此代码添加到您的 build.gradle 在您的模块或您的应用程序模块中,该错误将消失!

implementation 'org.checkerframework:checker:2.1.10'

加上这个,处理器模块就可以工作了

整个build.gralde是这样的:

apply plugin: 'java-library'
repositories {
    mavenCentral()
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.squareup:javapoet:1.11.1'
    implementation 'com.google.auto.service:auto-service:1.0-rc6'
    implementation 'org.checkerframework:checker:2.1.10'

    api project(':baseAnnotation')
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"

tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

重要的是

implementation 'org.checkerframework:checker:2.1.10'

这是我的 android 工作室秀

记住只将此添加到您的 build.grale(应用程序或模块都适合您) 此错误只是代码检查错误,只是 android studio 应用程序检查错误

   implementation 'org.checkerframework:checker:2.1.10'
    provided project(':processAnnotation')
    annotationProcessor project(":processAnnotation")

processAnnotation 是我的进程模块。