经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Java注解,看完就会用
来源:cnblogs  作者:Java备忘录  时间:2024/1/2 10:37:29  对本文有异议

一、什么是注解

定义:注解(Annotation),也叫元数据。一种代码级别的说明。

它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。

它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

二、内置注解

  • @Override: 标记在成员方法上,用于标识当前方法是重写父类(父接口)方法,编译器在对该方法进行编译时会检查是否符合重写规则,如果不符合,编译报错。
  • @Deprecated: 用于标记当前类、成员变量、成员方法或者构造方法过时如果开发者调用了被标记为过时的方法,编译器在编译期进行警告。
  • @SuppressWarnings: 压制警告注解,可放置在类和方法上,该注解的作用是阻止编译器发出某些警告信息。

三、元注解

元注解即注解的注解。

在jdk的中java.lang.annotation包中定义了四个元注解。

@Target

指定被修饰的注解的作用范围,如果不写默认是任何地方都可以使用。

可选的参数值在枚举类ElemenetType中包括:

  1. TYPE 用在类,接口上
  2. FIELD:用在成员变量上
  3. METHOD 用在方法上
  4. PARAMETER:用在参数上
  5. CONSTRUCTOR:用在构造方法上
  6. LOCAL_VARIABLE:用在局部变量上

@Retention

指定了被修饰的注解的生命周期。

可选的参数值在枚举类型RetentionPolicy中包括:

  1. SOURCE:注解只存在于Java源代码中,编译生成的字节码文件中就不存在了。
  2. CLASS:注解存在于Java源代码、编译以后的字节码文件中,运行的时候内存中没有,默认值。
  3. RUNTIME:注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中,程序可以通过反射获取该注解。

正常开发中我们自定义注解的时候无脑用 Runtime 就可以了。

@Documented

指定了被修饰的注解是可以Javadoc等工具文档化。

@Inherited

指定了被修饰的注解修饰程序元素的时候是可以被子类继承的。

四、自定义注解

定义格式

  1. 元注解
  2. public @interface 注解名称{
  3. 属性列表;
  4. }

注解的属性

  • 格式1:数据类型 属性名();
  • 格式2:数据类型 属性名() default 默认值;

示例如下:

  1. public @interface Student {
  2. String name();
  3. int age() default 18;
  4. String gender() default "男";
  5. }

注意:
没有默认值的属性是必填的,当属性只有一个,且属性名为 value 时,可以省略。

示例:

  1. public class Test {
  2. @Student("zhangsan")
  3. public void test(){
  4. }
  5. }
  6. public @interface Student {
  7. String value();
  8. }

反射解析注解

反射请移步:Java反射,看完就会用

如果反射懂了,注解懂了,那就不需要过多解释直接看示例就行了。

自定义注解 Book

  1. @Target({ElementType.METHOD,ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface Book {
  4. // 书名
  5. String value();
  6. // 价格
  7. double price() default 100;
  8. // 作者
  9. String[] authors();
  10. }

BookStore类

  1. @Book(value = "红楼梦",authors = "曹雪芹",price = 998)
  2. public class BookStore {
  3. }

TestAnnotation类

  1. public class TestAnnotation {
  2. public static void main(String[] args) throws Exception{
  3. System.out.println("---------获取类上注解的数据----------");
  4. test();
  5. }
  6. /**
  7. * 获取BookStore类上使用的Book注解数据
  8. */
  9. public static void test(){
  10. // 获得BookStore类对应的Class对象
  11. Class c = BookStore.class;
  12. // 判断BookStore类是否使用了Book注解
  13. if(c.isAnnotationPresent(Book.class)) {
  14. // 根据注解Class对象获取注解对象
  15. Book book = (Book) c.getAnnotation(Book.class);
  16. // 输出book注解属性值
  17. System.out.println("书名:" + book.value());
  18. System.out.println("价格:" + book.price());
  19. System.out.println("作者:" + Arrays.toString(book.authors()));
  20. }
  21. }
  22. }

联系我:
https://stanezhang.github.io/

原文链接:https://www.cnblogs.com/cosimo/p/17939862

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号