注解是如何实现的?

饭宝  金牌会员 | 2024-8-27 19:31:22 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 895|帖子 895|积分 2685

注解是否支持继续

不支持继续
不能使用关键字extends来继续某个@interface,但注解在编译后,编译器会自动继续java.lang.annotation.Annotation接口.
虽然反编译后发现注解继续了Annotation接口,但即使Java的接口可以实现多继续,但定义注解时依然无法使用extends关键字继续@interface。
区别于注解的继续,被注解的子类继续父类注解可以用@Inherited: 如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。
注解实现的原理
  1. //元注解
  2. public @interface 注解名称{
  3. }
复制代码
自定义的注解反编译后的内容
  1. public interface MyAnno extends java.lang.Innotation.Annotation {
  2. }
复制代码
也就是说,注解的本质其实就是一个接口,并且继续了java.lang.annotation.Annotation接口.
因此,注解里的属性都是常量,方法都是抽象方法。但是自定义注解不能使用void返回范例。而注解里的方法一般都叫 “属性”,因为用法一般都是:方法 = xxx
返回值范例有下列取值:

  • 基本数据范例
  • String
  • 枚举
  • 注解
  • 以上范例的数组
运行时注解解析

定义了注解后,就可以在代码中使用了,但这还没完,还需要对注解进行解析和处理。在运行时需要用到反射来解析注解,反射API中有专门用于处理注解的API:

  • AnnotatedElement :这是反射接口处理注解的核心范例,它是反射范例Method,Field和Constructor的基类,通过它的方法来获取注解Annotation实例。
  • 用Annotation来处理详细的注解
注意,注解的解析和处理用的是反射,以是注解定义时要用RententionPolicy.RUNTIME,否则用反射是拿不到注解信息的,因为反射是在运行时(Runtime)。
解析注解实例:
  1. public class MethodInfoParsing {
  2.     public static void main(String[] args) {
  3.         try {
  4.             Method[] methods = MethodInfoParsing.class
  5.                     .getClassLoader().loadClass("MethodInfoExample").getDeclaredMethods();
  6.             for (Method method : methods) {
  7.                 if (!method.isAnnotationPresent(MethodInfo.class)) {
  8.                     continue;
  9.                 }
  10.                 for (Annotation annotation : method.getDeclaredAnnotations()) {
  11.                     System.out.println("Annotation " + annotation + " on method " + method.getName());
  12.                 }
  13.                 MethodInfo info = method.getAnnotation(MethodInfo.class);
  14.                 if ("Paul".equals(info.author())) {
  15.                     System.out.println("From Pauls: " + method.getName());
  16.                 }
  17.             }
  18.         } catch (ClassNotFoundException e) {
  19.         }
  20.     }
  21. }
复制代码
关于作者

来自一线程序员Seven的探索与实践,持续学习迭代中~
本文已收录于我的个人博客:https://www.seven97.top
公众号:seven97,欢迎关注~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表