注解+反射

一,什么是反射??

反射机制是在运行状态中,对于任意一个类(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();
            }
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值