使用 JavaPoet 生成一个匿名字段 class
Generate a field as anonymous class with JavaPoet
我正在开发注释处理器库,我正在使用 JavaPoet 生成 som Java 代码。我需要生成一个 class,其中包含一个用匿名 class 声明的字段,如下代码所示:
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;
}
}
};
}
如何用 JavaPoet 定义 valueFloatListener
字段?提前Tnx.
你必须使用 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());
不确定代码是否编译干净,但我认为它显示了如何解决问题。
我正在开发注释处理器库,我正在使用 JavaPoet 生成 som Java 代码。我需要生成一个 class,其中包含一个用匿名 class 声明的字段,如下代码所示:
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;
}
}
};
}
如何用 JavaPoet 定义 valueFloatListener
字段?提前Tnx.
你必须使用 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());
不确定代码是否编译干净,但我认为它显示了如何解决问题。