注解Demo

158 阅读1分钟
注解类

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectView {
    @IdRes int value();//IdRes 语法检查,限制输入类型
//    String name();
}
//通过映射findViewById
public class InjectUtils {

    public static void injectView(Activity activity){
        Class<? extends Activity> cls = activity.getClass();//反射是基于class
        cls.getFields();//获得自己和父类的成员(不包括private,只能是public)
        cls.getDeclaredFields();//只能获得自己的成员(不包括父类),所有作用域
        Field[] fields = cls.getDeclaredFields();//获取此类所有的成员
        for (Field field : fields){
            //如果是true,被injectView打上了标签
            if (field.isAnnotationPresent(InjectView.class)){
                InjectView injectView = field.getAnnotation(InjectView.class);//获取标签
                int id = injectView.value();//获取标签的id值,如果取name,直接injectView.name();
                View view = activity.findViewById(id);
                //反射设置属性的值
                field.setAccessible(true);//设置反射的权限,允许修改private的属性
                try {
                    field.set(activity,view);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

应用

public class MainActivity extends AppCompatActivity {

    @InjectView(R.id.tv_name)
    private TextView tvName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InjectUtils.injectView(this);
        tvName.setText("zhhesjs j");
    }
}