2016-01-12 2 views
1

Я пытаюсь сделать некоторые пользовательские аннотации, чтобы уменьшить код плиты котла в моих приложениях для Android. Я знаю, что это выполнимо, поскольку существует множество библиотек, использующих один и тот же метод, например. . Итак, представьте себе этот простой Android Activity. Я хотел бы знать, как сделать CustomLibrary.printGoodInts работать так, как я хочу (возможно, используя отражение).Пользовательская аннотация Java/android

PS: если то, что я спрашиваю с ума, и слишком много, чтобы быть простой ответ, хорошая ссылка будет делать больше для меня тоже :)

public class MainActivity extends Activity { 

    @GoodInt 
    private int m1 = 10; 

    @GoodInt 
    private int m2 = 20; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     CustomLibrary.printGoodInts(this); // <<<<<<<<<< This is where magic happens 
    } 
} 


public class CustomLibrary { 
    public static void printGoodInts(Object obj){ 
     // Find all member variables that are int and labeled as @GoodInt 
     // Print them!! 
    } 
} 

ответ

1

Вы должны создать @GoodInt@interface. Вот пример:

import java.lang.annotation.*; 

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) // allow this annotation to be set only for fields 
public @interface GoodInt { 

} 

И напечатать все поля, которые имеют эту аннотацию, вы можете сделать это:

public static void printGoodInts(Object obj) throws IllegalArgumentException, IllegalAccessException { 
    Field[] fields = obj.getClass().getDeclaredFields(); 
    for (Field field : fields) { 
     if (field.isAnnotationPresent(GoodInt.class)) { 
      field.setAccessible(true); 
      System.out.println(field.getName() + " = " + field.get(obj)); 
     } 
    } 
}