2016-01-22 2 views
1

Попытки реализовать базовый пример JavaPoet (см ниже) в классе Android ActivityWatcher от LeakCanary:Как получить ссылку на Modifier.PUBLIC, которые не могут быть применены в строителе в MethodBuilder MethodSpec для 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 не найден C: \ AAAMachine \ Machine-master \ Machine-android \ src \ main \ java \ com \ bmp \ ActivityWatcher.java: 65: ошибка: метод addModifiers в классе Builder нельзя применять к заданным типам; .addModifiers (Modifier.PUBLIC, Modifier.FINAL) ^ required: Модификатор [] найдено: int, int Причина: varargs несоответствие; int не может быть преобразован в Модификатор C: \ AAAMachine \ Machine-master \ Machine-android \ src \ main \ java \ com \ bmp \ ActivityWatcher.java: 73: ошибка: не удается получить доступ Filer javaFile.writeTo (System.out) ; ^ файл класса для javax.annotation.processing.Filer не найден C: \ AAAMachine \ Machine-master \ Machine-android \ src \ main \ java \ com \ bmp \ ActivityWatcher.java: 172: ошибка: метод addModifiers в класс Builder не может применяться к заданным типам; .addModifiers (Modifier.PUBLIC, Modifier.STATIC) ^ required: Modifier [] found: int, int Причина: varargs несоответствие; int не может быть преобразован в Модификатор C: \ AAAMachine \ Machine-master \ Machine-android \ src \ main \ java \ com \ bmp \ ActivityWatcher.java: 179: ошибка: метод addModifiers в классе Builder не может применяться к заданным типам; .addModifiers (Modifier.PUBLIC, Modifier.FINAL) ^ required: Модификатор [] найдено: int, int Причина: varargs несоответствие; int не может быть преобразован в Модификатор 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

FAILURE: Строить неудачу с исключением.

  • Что пошло не так: Не удалось завершить выполнение задачи по ': Машина-андроид: compileDebugJava.

    Compilation failed; see the compiler error output for details.

  • Try: Run с --stacktrace возможностью получения трассировки стека. Запустите с опцией --info или --debug, чтобы получить больше выходных данных журнала.

BUILD FAILED

Общее время: 6.881 сек

и вот ошибка из сообщений:

:machine-android:compileDebugJava 

C: \ AAAmachine \ машинно-мастер \ машинно-андроида \ ЦСИ \ main \ java \ com \ bmp \ ActivityWatcher.java Ошибка: (58, 15) ошибка: не удается получить доступ к модификатору файл класса для javax.lang.model.element.Modifier не найден Ошибка: (65, 15) error: метод addModifiers в классе Builder не может применяться к заданным типам; Требуется: Модификатор [] найдено: int, int Причина: varargs несоответствие; int не может быть преобразован в Модификатор Ошибка: (73, 19) error: не удается получить доступ к Filer файл класса для javax.annotation.processing.Filer не найден Ошибка: (172, 15) error: метод addModifiers в классе Builder не может быть применен к заданным типам; Требуется: Модификатор [] найдено: int, int Причина: varargs несоответствие; int не может быть преобразован в модификатор Ошибка: (179, 15) error: метод addModifiers в классе Builder не может применяться к заданным типам; Требуется: Модификатор [] найдено: int, int Причина: varargs несоответствие; int не может быть преобразован в Модификатор Ошибка: (187, 19) error: не удается получить доступ к файлу класса для java.nio.file.Path не найден Примечание: C: \ AAAmachine \ machine-master \ machine-android \ src \ main \ java \ com \ bmp \ internal \ machineInternals.java использует или переопределяет устаревший API. Примечание: перекомпиляция с -Xlint: устаревшие сведения. Примечание: некоторые сообщения были упрощены; перекомпилировать с -Xdiags: verbose для получения полного вывода Ошибка: выполнение выполнено для задачи ': 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

Вот суть исходного кода, используя простой пример из readme.md файла из JavaPoet:

package com.bmp; 

импорт android.annotation.TargetApi; импорт android.app.Activity; импорт android.app.Application; import android.content.Context; импорт android.content.SharedPreferences; import android.os.Bundle; импорт android.preference.PreferenceManager; импорт android.util.Log; import android.view.ViewGroup;

импорт com.bmp.util.eventbus.FabricLogEvent; импорт com.squareup.javapoet.JavaFile; импорт com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeSpec;

импорт java.io.File; import java.io.FileWriter; import java.io.IOException; импорт java.lang.reflect.Модификатор;

импорт de.greenrobot.event.EventBus;

импорт статический 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 {

государственной статической силы (приложение Application, RefWatcher refWatcher) installOnIcsPlus { если (SDK_INT < ICE_CREAM_SANDWICH) { // Если вам необходимо поддерживать Android < ICS, переопределить onDestroy() в вашей базовой деятельности. возвращение; } ActivityWatcher activityWatcher = new ActivityWatcher (приложение, 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

Изменить ваш импорт на import javax.lang.model.element.Modifier. Если вы не можете импортировать этот пакет, измените конфигурацию модуля вашего проекта с Android SDK на Java SDK.

+0

Есть ли способ скомпилировать это как модуль в рамках проекта Android в Android Studio или есть ли файл aar, который я мог бы использовать? –

0

В вашем проекте Android создайте единый Java-модуль для использования кода JavaPoet.
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.

+0

Добро пожаловать в переполнение стека! Я отредактировал ваш ответ. Если вы хотите показать фрагмент кода, лучше всего показать его как текст. Затем пользователи могут его скопировать. Чтобы поместить код в 'code markdown', отступьте его на 4 пробела. Спасибо за вклад, я надеюсь, что ваш ответ будет полезен! –

+1

Вы правы. Спасибо. Я сделаю это в следующий раз. – luguanquan