首页 > 极客资料 博客日记
注解是如何实现的?
2024-08-27 21:00:04极客资料围观25次
极客之家推荐注解是如何实现的?这篇文章给大家,欢迎收藏极客之家享受知识的乐趣
注解是否支持继承
不支持继承
不能使用关键字extends来继承某个@interface,但注解在编译后,编译器会自动继承java.lang.annotation.Annotation接口.
虽然反编译后发现注解继承了Annotation接口,但即使Java的接口可以实现多继承,但定义注解时依然无法使用extends关键字继承@interface。
区别于注解的继承,被注解的子类继承父类注解可以用@Inherited: 如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。
注解实现的原理
//元注解
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,欢迎关注~
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”