自定义注解实现
问题描述
最近在写API开放平台,使用了鱼皮的初始化模板,里面关于权限验证使用了自定义的注解@AuthCheck,但是我想弄懂这个是怎么实现的。所以就对于这个问题,进行了简单的学习和了解。
分析
使用自定义注解分为三个部分
- 定义自己的注解
- 在对应的类,方法,字段上加上注解
- 使用注解处理器,处理注解
定义自己的注解
如果需要创建一个需要三步
- 使用@Interface 表示当前是个注解
- 添加两个元注解
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- 定义注解中的方法,返回类型,默认值
我将结合一个示例代码来说明各个部分的作用,尊嘟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"这个字符串
使用注解
- 按照注解规则,在对应的类或者方法或者属性上使用注解
- 给注解的方法设置返回值,比如我上面的例子。@MyTest(value = "value:帅哥",test = "test:帅哥")
注解处理器
为什么要使用注解处理器呢?这个注解处理器的作用是什么呢?
说人话就是:调用注解中的方法,方法给出返回值
比如:我使用注解时@MyTest(value = "value:帅哥",test = "test:帅哥"),我就是要取出value的值"value:帅哥"来使用。
那么怎么取出值呢?
类似于,我们使用类对象是怎么取出值的?
- 获得这个对象
- 对象调用这个方法
- 调用方法给出返回值
这个值就是我们需要的。
在使用注解时也是一样的。这是一个简单的示例代码
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个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
