如何在MethodPpec的方法构建器中为JavaPoet

时间:2016-01-22 23:25:54

标签: android javapoet

尝试在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)

以及以下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的类文件 C:\ AAAMachine \ Machine-master \ Machine-android \ src \ main \ java \ com \ bmp \ ActivityWatcher.java:65:error:class Builder中的方法addModifiers不能应用于给定的类型;               .addModifiers(Modifier.PUBLIC,Modifier.FINAL)               ^   必需:修饰符[]   发现:int,int   原因:varargs不匹配; int无法转换为Modifier C:\ AAAMachine \ Machine-master \ Machine-android \ src \ main \ java \ com \ bmp \ ActivityWatcher.java:73:error:无法访问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)               ^   必需:修饰符[]   发现:int,int   原因:varargs不匹配; int无法转换为Modifier C:\ AAAMachine \ Machine-master \ Machine-android \ src \ main \ java \ com \ bmp \ ActivityWatcher.java:179:错误:类Builder中的方法addModifiers不能应用于给定的类型;               .addModifiers(Modifier.PUBLIC,Modifier.FINAL)               ^   必需:修饰符[]   发现:int,int   原因:varargs不匹配; int无法转换为Modifier C:\ AAAMachine \ Machine-master \ Machine-android \ src \ main \ java \ com \ bmp \ ActivityWatcher.java:187:错误:无法访问路径           javaFile.writeTo(System.out的);                   ^   找不到java.nio.file.Path的类文件 注意:C:\ AAAMachine \ Machine-master \ Machine-android \ src \ main \ java \ com \ bmp \ internal \ MachineInternals.java使用或覆盖不推荐使用的API。 注意:使用-Xlint重新编译:弃用以获取详细信息。 注意:某些消息已经简化;使用-Xdiags重新编译:详细以获得完整输出 6个错误

FAILED

失败:构建因异常而失败。

  • 出了什么问题: 任务执行失败':Machine-android:compileDebugJava'。

      

    编译失败;有关详细信息,请参阅编译器错误输出。

  • 尝试: 使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获得更多日志输出。

建立失败

总时间:6.881秒

以及来自消息的错误:

:machine-android:compileDebugJava

C:\ AAAmachine \机器主\机器机器人\ SRC \主\的java \ COM \ BMP \ ActivityWatcher.java 错误:(58,15)错误:无法访问修饰符 找不到javax.lang.model.element.Modifier的类文件 错误:(65,15)错误:类Builder中的方法addModifiers无法应用于给定类型; 必需:修饰符[] 发现:int,int 原因:varargs不匹配; int无法转换为Modifier 错误:(73,19)错误:无法访问Filer 找不到javax.annotation.processing.Filer的类文件 错误:(172,15)错误:类Builder中的方法addModifiers无法应用于给定类型; 必需:修饰符[] 发现:int,int 原因:varargs不匹配; int无法转换为Modifier 错误:(179,15)错误:类Builder中的方法addModifiers无法应用于给定类型; 必需:修饰符[] 发现:int,int 原因:varargs不匹配; int无法转换为Modifier 错误:(187,19)错误:无法访问Path 找不到java.nio.file.Path的类文件 注意:C:\ AAAmachine \ machine-master \ machine-android \ src \ main \ java \ com \ bmp \ internal \ machineInternals.java使用或覆盖不推荐使用的API。 注意:使用-Xlint重新编译:弃用以获取详细信息。 注意:某些消息已经简化;使用-Xdiags重新编译:详细以获得完整输出 错误:任务执行失败':machine-android:compileDebugJava'。

  

编译失败;请参阅编译器错误输出以获取详细信   信息:建筑失败   信息:总时间: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)公共最终类ActivityWatcher {

public static void installOnIcsPlus(Application application,RefWatcher refWatcher){     if(SDK_INT< ICE_CREAM_SANDWICH){       //如果你需要支持Android< ICS,覆盖基础活动中的onDestroy()。       返回;     }     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();
  }

}

是否与要写入的物理文件名相关?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

在Android项目中,为代码使用JavaPoet创建一个Java模块 suce为select the java library

在此模块中,您的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'
}

the build.gradle in the java library

答案 2 :(得分:0)

我发现这种方式可以工作

这只是Android Studio错误。 Android Studio代码为此检查错误。 将此代码添加到您的模块或应用模块的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 studio表演的截图

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

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

processAnnotation是我的流程模块。