注释处理器:初始化字段

时间:2017-04-08 11:54:30

标签: android annotation-processing javapoet

我正在android中编写一个注释处理器来生成一个java文件。我正在使用public class GreenAdapter extends RecyclerView.Adapter<GreenAdapter.NumberViewHolder> { private final String TAG = GreenAdapter.class.getSimpleName(); private int mNumberItems; public GreenAdapter(int numberOfItems) { mNumberItems = numberOfItems; } @Override public NumberViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { Context context = viewGroup.getContext(); int layoutIdForListItem; if (viewType==1) { layoutIdForListItem = R.layout.first; } else { layoutIdForListItem = R.layout.number_list_item; } LayoutInflater inflater = LayoutInflater.from(context); boolean shouldAttachToParentImmediately = false; View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately); NumberViewHolder viewHolder = new NumberViewHolder(view); return viewHolder; } @Override public int getItemViewType(int position) { int First; switch (position) { case 0: First=1; break; default: First = 0; } return First; } @Override public void onBindViewHolder(NumberViewHolder holder, int position) { Log.d(TAG, "#" + position); holder.bind(position); } @Override public int getItemCount() { return mNumberItems; } class NumberViewHolder extends RecyclerView.ViewHolder { TextView listItemNumberView; public NumberViewHolder(View itemView) { super(itemView); listItemNumberView = (TextView) itemView.findViewById(R.id.TV1); } void bind(int listIndex) { //String[] messages = getResources().getStringArray(R.array.messageArray); //listItemNumberView.setText(messages[listIndex]); switch (listIndex) { case 0: if (setStatusError) {Status="Cannot connect to eve-central";} listItemNumberView.setText(Status); break; case 1: listItemNumberView.setText(Buy[listIndex-1]+" "+Sell[listIndex-1]); break; case 2: listItemNumberView.setText(Buy[listIndex-1]+" "+Sell[listIndex-1]); break; default:listItemNumberView.setText(String.valueOf(listIndex)); } } } } 库。

生成文件的目的: 它应该有一个具有我的处理器支持的特定注释的类的名称列表,并提供一个公共方法来获取该列表。

现在,我已经生成了文件:

JavaPoet

现在,问题是:如何从处理器初始化 private final List<String> names; GeneratedFile(ArrayList<String> names) { this.names = names; } public List<String> getNames() { return names; } 字段? names api为字段提供Javapoet,但只接受一个字符串。 在我的处理器中,我有支持注释的类列表。我想用该列表填充此字段。

1 个答案:

答案 0 :(得分:0)

您已经知道,JavaPoet仅提供一个字符串来指定字段初始化。要完成您的任务,您必须(我将向您展示一些与您的问题无关的代码,但这可能是向您展示如何执行此操作的一个很好的示例):

  • 从注释处理器获取带有注释的类列表(代码是从my library复制的):

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        model = new PrefsModel();
    
        parseBindType(roundEnv);
    
        // Put all @BindSharedPreferences elements in beanElements
        for (Element item : roundEnv.getElementsAnnotatedWith(BindSharedPreferences.class)) {
            AssertKripton.assertTrueOrInvalidKindForAnnotationException(item.getKind() == ElementKind.CLASS, item, BindSharedPreferences.class);
    
          // store type name somewhere
        }
    
        return true;
    }
    
  • 使用这组TypeName为您的字段生成初始值:

    ...
    Builder sp = FieldSpec.builder(ArrayTypeName.of(String.class), "COLUMNS", Modifier.STATIC, Modifier.PRIVATE,
        Modifier.FINAL);
    String s = "";
    StringBuilder buffer = new StringBuilder();
    for (SQLProperty property : entity.getCollection()) {
      buffer.append(s + "COLUMN_" + 
         columnNameToUpperCaseConverter.convert(property.getName()));
     s = ", ";
    }
    classBuilder.addField(sp.addJavadoc("Columns array\n").initializer("{" + 
      buffer.toString() + "}").build());    
    ...
    

您将在github上找到我的图书馆。特别是,您必须阅读com.abubusoft.kripton.processor.sqlite.BindTableGenerator类。

希望这些信息仍然有用。