网站首页 > java教程 正文
在Java中,注解和class、interface一样,也是一种类型。Java 注解是从 Java5 开始添加到 Java 语言的。SpringBoot框架就广泛地应用了注解,而取代了XML配置文件。对于Java开发人员来说,Java注解也是非常常用的Java语法特性之一。
Java语言有多少个注解呢?
Java最开始的内置注解有7个,其中3个是用来修饰代码的。
- @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
- @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
另外还有4个注解是作用在自定义注解上的,是注解的注解,因此也被称为“元注解”。
- @Retention - 标识这个注解存在的阶段,比如只是存在于代码中(编译器),还是会编入字节码文件中(类加载),或者是在运行时可以通过反射访问(运行时)。
- @Documented - 能够将注解中的元素包含在用户文档中。
- @Target - 标记注解应该作用在什么元素上,比如Java类,类方法,或者类属性等。
- @Inherited - 标记这个注解是继承于哪个注解类。一个被@Inherited作用的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。
从 Java 7 开始,又陆续添加了一些新的注解:
- @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
- @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
- @Repeatable - Java 8 开始支持的元注解,标识某注解可以在同一个声明上使用多次,而且每次使用注解可以代表不同的含义。
- @Native - Java 8 开始支持的元注解,使用 @Native 注解修饰成员变量,则表示这个变量可以被本地代码引用。
注解的本质
从上面的图中可以看出,上面提到的所有注解都是接口 Annotation的实现。
package java.lang.annotation;
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}
每1个注解都和 1 个 RetentionPolicy 关联。RetentionPolicy 是 Enum 枚举类型,它用来指定 Annotation 的保留策略;每1个注解还和1个或多个 ElementType 关联,ElementType 也是个枚举类型,它用来指定 Annotation 的类型。
如何自定义注解
Java自定义注解用的修饰符是 @interface。
以下代码就定义了一个注解 MyAnnotation。
public @interface MyAnnotation {
//blabla
}
接着我们就可以在类或者方法上使用刚刚定义好的注解。
@MyAnnotation
public class test {
@MyAnnotation
public static void main(String[] args){
//blabla
}
}
但是刚刚定义的注解是没有任何意义的,要使我们自己的注解工作,就要用到元注解,需要用元注解来修饰我们的注解。前面介绍的元注解最常用的就是:@Retention、 @Target、 @Document、 @Inherited和@Repeatable(JDK1.8加入)。
Retention的英文含义就是保留、保持的意思,使用@Retention 就是来决定注解会存在到哪个阶段,是保留在源码,字节码,或者运行期。自定义注解通常都是使用 @Retention(RetentionPolicy.RUNTIME),即保留到运行期。
使用@Target元注解表示注解的类型,若一个 Annotation 对象是 METHOD 类型,则该 Annotation 只能用来修饰方法。
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
//blabla
}
这样我们就定义了一个运行时注解MyAnnotation,可以用来作用在类、接口或枚举类型上(ElementType.TYPE)。
注解的作用
最后我们来总结下注解的作用:
- 提供信息给编译器: 编译器可以利用注解来检测出错误或者警告信息,打印出日志。
- 编译阶段时的处理: 软件工具可以用来利用注解信息来自动生成代码、文档或者做其它相应的自动处理。
- 运行时处理: 某些注解可以在程序运行的时候接受代码的提取,自动做相应的操作。
我会持续更新关于物联网、云原生以及数字科技方面的文章,用简单的语言描述复杂的技术,也会偶尔发表一下对IT产业的看法,请大家多多关注,欢迎留言和转发,希望与大家互动交流,谢谢。
猜你喜欢
- 2025-05-03 又被问到了, java 面试题:反射的实现原理及用途?
- 2025-05-03 java面向对象编程(Java面向对象编程的三个特征)
- 2025-05-03 Java程序员如何学习Golang(一)(java程序员教程)
- 2025-05-03 Java程序员,一周Python入门:面向对象(OOP) 对比学习
- 2025-05-03 一篇文章带你打开面向对象编程的新大门!即掌握Java反射
- 2025-05-03 idea万能快捷键,你不知道的17个实用技巧!!!
- 2025-05-03 疯传!Java 继承底层逻辑大揭秘,看完直接拿捏面试官!
- 2025-05-03 Java中public、protected、package-private和private的区别
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)