Search code examples
javaannotation-processingjavapoet

Generate a field as anonymous class with JavaPoet


I'm working on an annotation processor library and I'm using JavaPoet to generate som Java code. I need to generate a class with a field declared with an anonymous class like the following code:

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;
            }

        }
    };  
}

How can I define valueFloatListener field with JavaPoet? Tnx in advance.


Solution

  • You have to use TypeSpec.anonymousClassBuilder("").

    Something like this should work:

    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()); 
    

    Not sure if the code is compile clean, but I think it shows, how to solve the problem.