自定义运行时注解

自定义运行时注解

声明注解

  1. 通过@Retention(RetentionPolicy.RUNTIME)元注解确定我们注解是在运行的时候使用。
  2. 通过@Target确定我们注解是作用在什么上面的(变量、函数、类等)。
  3. 确定我们注解需要的参数。

解析注解

  1. 找到类对应的所有属性或者方法(至于是找类的属性还是方法就要看我自定义的注解是定义方法上还是属性上了)。
  2. 找到添加了我们注解的属性或者方法。
  3. 做我们注解需要自定义的一些操作。

1、获取类的属性和方法

通过Class对象我们就可以很容易的获取到当前类里面所有的方法和属性了:

方法说明
public String getName();获取包名加类名
public String getSimpleName();获取类名
public Constructor<?>[] getConstructors();返回当前类和父类的public构造方法
public Constructor<?>[] getDeclaredConstructors();返回当前类所有的构造方法(public、private和protected)不包括父类
public Field[] getFields();返回当前类所有public的字段,包括父类
public native Field[] getDeclaredFields();返回当前类所有申明的字段,即包括public、private和protected,不包括父类
public Method[] getMethods();返回当前类所有public的方法,包括父类
public Method[] getDeclaredMethods();返回当前类所有的方法,即包括public、private和protected,不包括父类
public Method getEnclosingMethod();获取局部或匿名内部类在定义时所在的方法
public Package getPackage();获取当前类的包
public String getPackageName();获取当前类的包名
public Type getGenericSuperclass();获取当前类的直接超类的 Type
public Class<?>[] getInterfaces();返回当前类直接实现的接口.不包含泛型参数信息
public int getModifiers();返回当前类的修饰符,public,private,protected

2、找到添加注解的属性或者方法

  • 每个属性对应Field
  • 每个方法对应Method
  • 而且FieldMethod都实现了AnnotatedElement接口

AnnotatedElement接口我们就可以很容易的找到添加了我们指定注解的方法或者属性了。

AnnotatedElement接口常用方法如下:

返回值方法名称说明
<T extends Annotation> TgetAnnotation(Class annotationClass)该元素如果存在指定类型的注解,则返回这些注解,否则返回 null。
Annotation[]getAnnotations()返回此元素上存在的所有注解,包括从父类继承的
booleanisAnnotationPresent(Class<? extends Annotation> annotationClass)如果指定类型的注解存在于此元素上,则返回 true,否则返回 false。
Annotation[]getDeclaredAnnotations()返回直接存在于此元素上的所有注解,注意,不包括父类的注解,调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响,没有则返回长度为0的数组
<T extends Annotation> T[]getAnnotationsByType(Class annotationClass)返回该元素指定类型的注解
<T extends Annotation> T[]getDeclaredAnnotationsByType(Class annotationClass)返回直接存在该元素上某类型的注解,不包括父类

3、做自定义注解需要做的事情

添加了我们注解的属性或者方法已经拿到了,之后要做的就是自定义注解自定义的一些事情了。比如在某些特定条件下自动去执行我们添加注解的方法。

相关示例代码:AndroidAnnotationDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值