注解+反射

什么是反射??

反射机制是在运行状态中,对于任意一个类(Class),都能够知道这个类的所有属性和方法(Method);对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

在这里插入图片描述

什么是注解??
Annotation(注解)就是Java提供了一种源程序中的元素关联任何信息或者任何元数据(metadata)的途径和方法。
Annotation是被动的元数据,永远不会有主动行为

一,元注解
元注解有:
@Retention:注解保留的生命周期
@Target:注解对象的作用范围。
@Inherited:@Inherited标明所修饰的注解,在所作用的类上,是否可以被继承。
@Documented:如其名,javadoc的工具文档化,一般不关心。
@Target
Target标明了注解的适用范围,对应ElementType枚举,明确了注解的有效范围。

	TYPE:类、接口、枚举、注解类型。
	FIELD:类成员(构造方法、方法、成员变量)。
	METHOD:方法。
	PARAMETER:参数。
	CONSTRUCTOR:构造器。
	LOCAL_VARIABLE:局部变量。
	ANNOTATION_TYPE:注解。
	PACKAGE:包声明。
	TYPE_PARAMETER:类型参数。
	TYPE_USE:类型使用声明。

@Inherited
注解所作用的类,在继承时默认无法继承父类的注解。除非注解声明了 @Inherited。同时Inherited声明出来的注,只对类有效,对方法/属性无效。

二,自定义注解
1 ,运行时注解
了解了元注解后,看看如何实现和使用自定义注解。这里我们简单介绍下运行时注 解RUNTIME,编译时注解CLASS留着后面分析。
首先,创建一个注解遵循: public @interface 注解名 {方法参数}
2,编译时注解
运行时注解RUNTIME如上2.1所示,大多数时候实在运行时使用反射来实现所需效 果,这很大程度上影响效率,如果BufferKnife的每个View注入不可能如何实现。实 际上,ButterKnife使用的是编译时注解CLASS,如下图X2.2,是ButterKnife的 @BindView注解,它是一个编译时注解,在编译时生成对应java代码,实现注入。

下面开始通过反射获取注解的内容

1,

 <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击"/>

2,自定义注解类DraweeViewAnnotation

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface DraweeViewAnnotation {
    String name();
}

3,MainActivity

public class MainActivity extends AppCompatActivity {

    @DraweeViewAnnotation(name = "哈哈哈你怕是个傻子吧")
    String str;
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getwocontent();

            }


        });
    }
    private void getwocontent() {
        MainActivity activity = new MainActivity();
        Class aClass = activity.getClass();
        Field[] fields = aClass.getDeclaredFields();
        for(Field f:fields)
        {
            DraweeViewAnnotation annotation = f.getAnnotation(DraweeViewAnnotation.class);
            if(annotation!=null)
            {
                String name = annotation.name();
                Log.d("name",name);
                Toast.makeText(MainActivity.this,name,Toast.LENGTH_LONG).show();
            }
        }
    }

}

猜你喜欢

转载自blog.csdn.net/qq_43589991/article/details/85253348