注解是如何实现的?

cnblogs 2024-08-28 08:09:15 阅读 99

注解是否支持继承

不支持继承

不能使用关键字extends来继承某个@interface,但注解在编译后,编译器会自动继承java.lang.annotation.Annotation接口.

虽然反编译后发现注解继承了Annotation接口,但即使Java的接口可以实现多继承,但定义注解时依然无法使用extends关键字继承@interface。

区别于注解的继承,被注解的子类继承父类注解可以用@Inherited: 如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。

注解实现的原理

<code>//元注解

public @interface 注解名称{

}

自定义的注解反编译后的内容

public interface MyAnno extends java.lang.Innotation.Annotation {

}

也就是说,注解的本质其实就是一个接口,并且继承了java.lang.annotation.Annotation接口.

因此,注解里的属性都是常量,方法都是抽象方法。但是自定义注解不能使用void返回类型。而注解里的方法一般都叫 “属性”,因为用法一般都是:方法 = xxx

返回值类型有下列取值:

  • 基本数据类型

  • String

  • 枚举

  • 注解

  • 以上类型的数组

运行时注解解析

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

  • AnnotatedElement :这是反射接口处理注解的核心类型,它是反射类型Method,Field和Constructor的基类,通过它的方法来获取注解Annotation实例。
  • 用Annotation来处理具体的注解

注意,注解的解析和处理用的是反射,所以注解定义时要用RententionPolicy.RUNTIME,否则用反射是拿不到注解信息的,因为反射是在运行时(Runtime)。

解析注解实例:

public class MethodInfoParsing {

public static void main(String[] args) {

try {

Method[] methods = MethodInfoParsing.class

.getClassLoader().loadClass("MethodInfoExample").getDeclaredMethods();

for (Method method : methods) {

if (!method.isAnnotationPresent(MethodInfo.class)) {

continue;

}

for (Annotation annotation : method.getDeclaredAnnotations()) {

System.out.println("Annotation " + annotation + " on method " + method.getName());

}

MethodInfo info = method.getAnnotation(MethodInfo.class);

if ("Paul".equals(info.author())) {

System.out.println("From Pauls: " + method.getName());

}

}

} catch (ClassNotFoundException e) {

}

}

}

关于作者

来自一线程序员Seven的探索与实践,持续学习迭代中~

本文已收录于我的个人博客:https://www.seven97.top

公众号:seven97,欢迎关注~



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。