Создать поле как анонимный класс с JavaPoet - PullRequest
0 голосов
/ 24 мая 2018

Я работаю над библиотекой процессора аннотаций и использую JavaPoet для генерации сом-кода Java.Мне нужно сгенерировать класс с полем, объявленным с анонимным классом, как следующий код:

public class Dummy {
    private final OnSharedPreferenceChangeListener valueFloatListener = new OnSharedPreferenceChangeListener() {

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            switch (key) {
            case "value_float":
                valueFloatSubject.onNext(sharedPreferences.getFloat(key, defaultBean.valueFloat));
                break;
            }

        }
    };  
}

Как я могу определить valueFloatListener поле с JavaPoet?Tnx заранее.

1 Ответ

0 голосов
/ 01 июня 2018

Вы должны использовать TypeSpec.anonymousClassBuilder("").

Что-то вроде этого должно работать:

MethodSpec.Builder method = 
    MethodSpec.methodBuilder("onSharedPreferenceChangeListener")
              .addAnnotation(Override.class)
              .addModifiers(Modifier.PUBLIC, 
                            Modifier.FINAL)  
              .addParameter(ParameterSpec.builder(ClassName.get(SharedPreferences.class),
                                                                "sharedPreferences")
                                         .build())
              .addParameter(ParameterSpec.builder(ClassName.get(String.class), 
                                                  "key")
                                         .build())
              .addCode(" add the switch-statement here ...");

TypeSpec.Builder typeSpec = 
    TypeSpec.classBuilder("Dummy")
            .addModifiers(Modifier.PUBLIC)
            .addStatement("private final $T valueFloatListener = new $T() $L",
                          ClassName.get(OnSharedPreferenceChangeListener.class),
                          ClassName.get(OnSharedPreferenceChangeListener.class), 
                          TypeSpec.anonymousClassBuilder("")
                                  .addSuperinterface(ClassName.get(OnSharedPreferenceChangeListener.class))
                                  .addMethod(method.build())
                                  .build()); 

Не уверен, что код скомпилирован, но я думаю, что это показывает, как решитьпроблема.

...