尝试在 LeakCanary 的 Android ActivityWatcher 类中实现基本的 JavaPoet 示例(见下文):
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
Modifier.PUBLIC 和 Modifier.STATIC 以及其他 .addModifiers 语句产生 Android Studio 错误
Builder中的addModifiers(javax.lang.model.element.modifier...)不能应用于(int, int)
和以下梯度错误:
: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 未找到 C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\ActivityWatcher.java:65:错误:类 Builder 中的方法 addModifiers 无法应用于给定类型;.addModifiers(Modifier.PUBLIC, Modifier.FINAL) ^ required: Modifier[] found: int,int reason: varargs mismatch; int 无法转换为修饰符 C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\ActivityWatcher.java:73: error: cannot access Filer javaFile.writeTo(System.out); ^ 找不到 javax.annotation.processing.Filer 的类文件 C: \AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\ActivityWatcher.java:172:错误:类 Builder 中的方法 addModifiers 不能应用于给定类型;.addModifiers(Modifier.PUBLIC, Modifier.STATIC) ^ 需要:Modifier[] found: int,int reason: varargs mismatch; int 无法转换为修饰符 C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\ActivityWatcher.java:179:错误:类 Builder 中的方法 addModifiers 不能应用于给定类型;.addModifiers(Modifier.PUBLIC, Modifier.FINAL) ^ required: Modifier[] found: int,int reason: varargs mismatch; int 无法转换为修饰符 C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\ActivityWatcher.java:187: 错误:无法访问路径 javaFile.writeTo(System. 出去); ^ 找不到 java.nio.file.Path 的类文件 注意:C:\AAAMachine\Machine-master\Machine-android\src\main\java\com\bmp\internal\MachineInternals.java 使用或覆盖已弃用的 API。注意:使用 -Xlint:deprecation 重新编译以获取详细信息。注意:一些消息已被简化;使用 -Xdiags:verbose 重新编译以获得完整的输出 6 错误
失败的
FAILURE:构建失败并出现异常。
出了什么问题:任务':Machine-android:compileDebugJava'执行失败。
编译失败;有关详细信息,请参阅编译器错误输出。
尝试:使用 --stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获得更多日志输出。
构建失败
总时间:6.881 秒
这是消息中的错误:
:machine-android:compileDebugJava
C:\AAAmachine\machine-master\machine-android\src\main\java\com\bmp\ActivityWatcher.java Error:(58, 15) error: cannot access Modifier class file for javax.lang.model.element.Modifier未找到错误:(65, 15) 错误:类 Builder 中的方法 addModifiers 不能应用于给定类型;必需:修饰符 [] 找到:int,int 原因:可变参数不匹配;int 无法转换为修饰符错误:(73、19)错误:无法访问 javax.annotation.processing.Filer 的 Filer 类文件未找到错误:(172、15)错误:类 Builder 中的方法 addModifiers 无法应用于给定类型; 必需:修饰符 [] 找到:int,int 原因:可变参数不匹配;int 无法转换为修饰符错误:(179, 15) 错误:类 Builder 中的方法 addModifiers 无法应用于给定类型;必需:修饰符 [] 找到:int,int 原因:可变参数不匹配;int 无法转换为修饰符错误:(187, 19) 错误:无法访问 java.nio.file.Path 的路径类文件。找不到路径注意:C:\AAAmachine\machine-master\machine-android\src\main\java \com\bmp\internal\machineInternals.java 使用或覆盖已弃用的 API。注意:使用 -Xlint:deprecation 重新编译以获取详细信息。注意:一些消息已被简化;使用 -Xdiags:verbose 重新编译以获得完整输出错误:任务“:machine-android:compileDebugJava”的执行失败。
编译失败;有关详细信息,请参阅编译器错误输出。信息:BUILD FAILED 信息:总时间:6.881 秒 信息:7 个错误 信息:0 个警告 信息:查看控制台中的完整输出
以下是使用 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();
}
}
会不会和要写入的物理文件名有关?