自定义注解

2018-12-25  本文已影响0人  TASTUYA
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface DraweeAnnotation {
    String value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AutoWired {
}

AutoWired注解的解析,找到AutoWired注解的变量,创建对象,在吧对象赋值给AutoWired指定的那个变量。

public class AutoWiredProcess {
    
    //创建对象
    public static void bind(Object object) {
        Class aClass = object.getClass();
        Field[] fields = aClass.getDeclaredFields();
        //给AutoWiredProcess里面的一个成员变量创建对象
        for (Field f : fields) {
            //这个方法就是判断这个变量有没有加参数里面的注解
            AutoWired annotation = f.getAnnotation(AutoWired.class);
            if (annotation != null) {
                //必须写暴力反射
                f.setAccessible(true);
                //找到这个变量  因为反射机制提供了一个方法让你通过成员变量就可以获取到一个字节码对象
                Class type = f.getType();
                try {
                    Constructor constructor = type.getConstructor();
                    //给AutoWiredProcess里面一个成员变量赋值
                    f.set(object, constructor.newInstance());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

AutoWired注解的使用,在onCrate()方法里面调用AutoWiredProcess.bind(this);来解析注解。

public class AnnotationActivity extends AppCompatActivity {

    @AutoWired
    Student mStu;
    @DraweeAnnotation("Hellow")
    String mStr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_annotation);
        AutoWiredProcess.bind(this);
        /*mStu.getInfo("Hellow");
        Toast.makeText(this, mStu.toString(), Toast.LENGTH_SHORT).show();*/

        getAnnotationContent();
    }

    //获取值的方法
    private void getAnnotationContent() {
        AnnotationActivity annotationActivity = new AnnotationActivity();
        Class aClass = annotationActivity.getClass();
        Field[] fields = aClass.getDeclaredFields();
        for (Field f : fields) {
            DraweeAnnotation annotation = f.getAnnotation(DraweeAnnotation.class);
            if (annotation != null) {
                String value = annotation.value();
                Toast.makeText(this, value.toString(), Toast.LENGTH_SHORT).show();
            }
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读