如何在 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 个错误
失败
失败:构建失败,出现异常。
出了什么问题:
任务 ':Machine-android:compileDebugJava' 执行失败。
Compilation failed; see the compiler error output for details.
尝试:
运行 使用 --stacktrace 选项获取堆栈跟踪。 运行 使用 --info 或 --debug 选项以获得更多日志输出。
构建失败
总时间: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 是我的进程模块。
正在尝试在来自 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 个错误
失败
失败:构建失败,出现异常。
出了什么问题: 任务 ':Machine-android:compileDebugJava' 执行失败。
Compilation failed; see the compiler error output for details.
尝试: 运行 使用 --stacktrace 选项获取堆栈跟踪。 运行 使用 --info 或 --debug 选项以获得更多日志输出。
构建失败
总时间: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 是我的进程模块。