java注解
java注解
定义:注解,也叫元数据。一种代码级别的说明。它是jdk1.5后引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
编写文档:通过代码里标识的元数据生成文档【生成文档doc】
代码分析:通过代码里标识的元数据对代码进行分析
编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查
JDK内置注解
- @Overide
- 检测该注解标注的方法是否是继承自父类的接口
- @Deprecated
- 将该注解标注的内容标注为已过时
- @SuppressWannings
-
压制警告
package anno;
@SuppressWarnings("all")
public class Demo {@Override public String toString() { return super.toString(); } @Deprecated public void say() { } public void eat() { }
}
-
自定义注解
自定义注解的形式很简单
package anno;
public @interface Anno {
}
通过反编译才做可以看到自定义的注解是继承自java.lang.annotation.Annotation的接口
注解的属性
接口中可以定义的成员方法
package anno;
public @interface Anno {
public abstract String name();
}
- 要求:
-
属性的返回值类型:
- 基本数据类型
- String
- 枚举
- 注解
- 以上类型的数组
-
定义了属性,在使用时要给属性赋值
package anno;public class Demo {
@Anno(name = "666") public void say() { System.out.println("hello"); }
}
-
当定义的属性有default关键字的时候。可以不给属性赋值
package anno;public @interface Anno {
public abstract String name();
public abstract int age() default 10;
} -
如果只有一个属性需要赋值,属性的名字为value时,则value可以不写,直接赋值。
-
元注解
描述注解的注解
- @Target:描述注解能够作用的位置
-
ElementType.FIELD: 作用在属性上@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE}) public @interface Anno { public abstract String name(); public abstract int age() default 10; }
ElementType.METHOD:作用在方法上
ElementType.TYPE:作用在类上
-
- @Retention:描述注解被保留的阶段
- @Document:描述注解是否被抽取到api文档中
- @Inherited: 描述注解是否被子类继承
解析注解
获取注解中定义的属性值
package anno;
@Anno(name = "ivy", age = 20)
public class Test {
public static void main(String[] args) {
Class<Test> testClass = Test.class;
Anno annotation = testClass.getAnnotation(Anno.class);
System.out.println(annotation); // @anno.Anno(age=20, name="ivy")
System.out.println(annotation.name()); // ivy
System.out.println(annotation.age()); // 20
}
}
package anno;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
public abstract String name();
public abstract int age() default 10;
}