自定义注解简单介绍及实现

/**
 * 元注解?约束注解的注解 给你提供些的格式
 * 如何写一个注解类
 * 
 * 新写一个类把类的修饰符改成@interface
 * 
 * Retention 这个注解再什么时候能作用到
 * Target 规定注解作用到成员变量或者成员方法
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TestRetention {
    String value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ClickView {
    int value();
}

定义一个绑定类,传一个object类型,一般是类对象,然后通过反射获取到它的属性或方法,之后做相关操作

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

            }
        }
    }

    //初始化组件  + 点击事件
    public static void bindView(final Activity activity) {
        Class cla = activity.getClass();
        Field[] field = cla.getDeclaredFields();
        Method[] methods = cla.getDeclaredMethods();
        for (Field f : field) {
            //这里面还是遵循java运行规律的
//            f.setAccessible(true);
            BindView annotation = f.getAnnotation(BindView.class);
            if (annotation != null) {
                View view = activity.findViewById(annotation.value());
                try {
                    f.set(activity, view);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }

    }
    for (final Method method : methods) {
        method.setAccessible(true);
        ClickView clickView = method.getAnnotation(ClickView.class);
        if (clickView != null && clickView.value() != 0) {
            final View viewById = activity.findViewById(clickView.value());
            viewById.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        method.invoke(activity, viewById);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}
}

这是Mydata bean类

public class MyData {
    private String name;
    private String sex;

public void setData(String name,String sex){
    this.name = name;
    this.sex = sex;
}
@Override
public String toString() {
    return "MyData{" +
            "name='" + name + '\'' +
            ", sex='" + sex + '\'' +
            '}';
}
}

绑定注解 功能是:如何得到 @TestRetention(“memeda”)
getZhujieConent();

public class ZJDemoActivity extends AppCompatActivity {
    @TestRetention("memeda")
    String mStr;
    @AutoObject
    Student mStu;
    @AutoObject
    MyData data;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_zjdemo);
    
    //功能是:如何得到 @TestRetention("memeda")
    // getZhujieConent();
    
    ZhuJieBind.bind(this);
    mStu.getInfo("lvxx");
    Toast.makeText(this, mStu.toString(), Toast.LENGTH_SHORT).show();
    data.setData("lf", "丑爆了");
    Toast.makeText(this, data.toString(), Toast.LENGTH_SHORT).show();
}

private void getZhujieConent() {
    ZJDemoActivity zjDemoActivity = new ZJDemoActivity();
    Class cls = zjDemoActivity.getClass();
    Field[] fields = cls.getDeclaredFields();
    for (Field f : fields) {
        TestRetention annotation = f.getAnnotation(TestRetention.class);
        if (annotation != null) {
            String value = annotation.value();
            Log.e("value", value);
        }
    }
}
}

绑定注解做点击事件

public class BindDemoActivity extends AppCompatActivity {
    @BindView(R.id.tv_one)
    public TextView tv;
    @BindView(R.id.bt_two)
    public Button bt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bind_demo);
        ZhuJieBind.bindView(this);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(BindDemoActivity.this, "卧槽,卧槽", Toast.LENGTH_SHORT).show();
            }
        });
    }

@ClickView(R.id.bt_two)
public void onClick(View view){
    Toast.makeText(this, "66哒", Toast.LENGTH_SHORT).show();
}

}

一个简单的注解讲解模型,就介绍到这里了,希望可以对你有帮助

猜你喜欢

转载自blog.csdn.net/wangyonghao132/article/details/85555253