不是程序本身,而是对程序作出解释 可以被其他程序(如编译器等)读取
@注释名(参数值) ps:不一定有参数
可以附加在 包、类、方法、属性 等上面 可以通过反射机制编程实现对这些元数据的访问
@Override //重写注解 @Deprecated //不推荐使用注解,表示危险或有更好的选择 @SuppressWarnings //抑制警告信息。需要加参数
注解其他注解。
@Target:用于描述注解的使用范围(用在哪) @Retention:用于表示需要在什么级别保存注解信息,用于描述注解的声明周期,(SOURCE < CLASS < RUNTIME) @Document:说明该注解将被包含在 javadoc 中 @Inherited:说明子类可以继承父类中的该注解
package com.kuang.annotation; import java.lang.annotation.*; //测试元注解 public class Test01 { @MyAnnotation public void test(){ } } //定义一个注解 //Target 表示我们的注解可以用在哪些地方 //ElementType.TYPE表示能在类级别的生效 @Target(value = {ElementType.METHOD, ElementType.TYPE}) //Retention 表示我们的注解在什么地方还有效 // runtime > class > sources @Retention(value = RetentionPolicy.RUNTIME) //Documented 表示是否将我们的注解生成在 Javadoc中 @Documented //Inherited 子类可以继承父类的注解 @Inherited @interface MyAnnotation{ }
package com.kuang.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //自定义注解 public class Test02 { //注解可以显示赋值,如果没有默认值,我们就必须给注解赋值 @MyAnnotation2(name = "帅哥") public void test(){} @MyAnnotation3("帅哥") public void test2(){ } } @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation2{ //注解的参数格式:参数类型 + 参数名(); String name() default ""; int age() default 0; int id() default -1; //如果默认值为-1,代表不存在。同indexof,如果找不到就返回-1 String[] schools() default {"哔哩哔哩", "家里蹲大学"}; } @interface MyAnnotation3{ //若只有一个参数,就可以设置为value //这样就可以只用写("帅哥"),而不用写(name = "帅哥") String value(); }