自定义注解实现

问题描述


最近在写API开放平台,使用了鱼皮的初始化模板,里面关于权限验证使用了自定义的注解@AuthCheck,但是我想弄懂这个是怎么实现的。所以就对于这个问题,进行了简单的学习和了解。



分析


使用自定义注解分为三个部分

  1. 定义自己的注解
  2. 在对应的类,方法,字段上加上注解
  3. 使用注解处理器,处理注解



定义自己的注解


如果需要创建一个需要三步

  1. 使用@Interface 表示当前是个注解
  2. 添加两个元注解
  3. @Target(ElementType.METHOD)
  4. @Retention(RetentionPolicy.RUNTIME)
  5. 定义注解中的方法,返回类型,默认值


我将结合一个示例代码来说明各个部分的作用,尊嘟o.O很easy.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {

String value() default "value:default";

String test() default "test:default";
}

@interface 就类似于,类的class表示这是一个注解


@Target(ElementType.METHOD):看见这个method了吗,就说明这个@MyTest注解,只能写到方法上面,如果写到其他地方就会报错。举例


@Retention(RetentionPolicy.RUNTIME):这个注解的作用就是指定注解会被保留到哪里。

如果使用Runtime就是表示运行时,也能被识别到,因此可以使用反射来获取。

这里建议参考一些文档吧:Retention注解


String value() default "value:default";这句话表示定一个叫value()的方法,返回值类型时String,没有赋值默认返回"vakue:default"这个字符串


使用注解


  1. 按照注解规则,在对应的类或者方法或者属性上使用注解
  2. 给注解的方法设置返回值,比如我上面的例子。@MyTest(value = "value:帅哥",test = "test:帅哥")


注解处理器


为什么要使用注解处理器呢?这个注解处理器的作用是什么呢?


说人话就是:调用注解中的方法,方法给出返回值

比如:我使用注解时@MyTest(value = "value:帅哥",test = "test:帅哥"),我就是要取出value的值"value:帅哥"来使用。


那么怎么取出值呢?

类似于,我们使用类对象是怎么取出值的?

  1. 获得这个对象
  2. 对象调用这个方法
  3. 调用方法给出返回值

这个值就是我们需要的。


在使用注解时也是一样的。这是一个简单的示例代码

package basicDemo;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class Main {
/**
* 1. 获得cTestController
* 2. 获得对应的方法
* 3. 获得方法上的注解
* 4. 判断注解是否存在
* @param args
*/
public static void main(String[] args) {

try {

//使用反射获得注解所在的类
Class<?> cTestController = Class.forName("basicDemo.TestController");

//获得注解所在的方法
Method testMethod = cTestController.getMethod("testMethod");
//获得方法上使用的注解
Annotation annoMyTest = testMethod.getAnnotation(MyTest.class);

//判断注解不为空,说明这个方法上确实使用了该注解
if(annoMyTest != null){
//类型强转
MyTest mytest = (MyTest) annoMyTest;
//注解调用value()方法,得到返回值
System.out.println("方法上的MyTest的value值:"+mytest.value());
}



} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}

}
}


个人建议


我推荐自己写一个全流程的快速入门demo,基本上再去看鱼皮的用户认证注解,就可以八九不离十了

反射处理注解

球友参考文档:概念讲解很详细,但是举得例子可能看着有点头疼。

注解开发




0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
照
下载 APP