一 、什么是注解?
注解是Java机制中用来修饰一个类、方法、属性的东西。运用注解我们可以影响类、方法、属性
二、Java自带的注解
Java本身提供了三个内置注解,他们分别是:
1. @Deprecated 表示java不赞成使用这些被描述的对象,如果我们使用了这些类、方法或者字段,编译器会给我们警告 2. @Override 表示子类要重写父类的方法,如果没重写,编译器会警告 3. @SuppressWarnings 使忽略编译器警告,比如在某个方法中我们做了一个不安全的类型转换,
用@SuppressWarnings修饰这个方法 ,编译器就不会警告了
三、元注解
元注解用来注解注解,java提供了4个元注解:
@Retention @Target @Documented @Inherited
@Retention
用来定义当前注解的作用范围:
- @Retention(RetentionPolicy.RUNTIME)
- @interface MyAnnotation {
- String value() default "";
- }
上面的代码表示Myannotation这个注解只在运行时有效
- RetentionPolicy.SOURCE : 注解只存在于源码中,不会存在于.class文件中,在编译时会被忽略掉
- RetentionPolicy.CLASS:注解只存在于.class文件中,在编译期有效,但是在运行期会被忽略掉,这也是默认范围
- RetentionPolicy.RUNTIME:在运行期有效,JVM在运行期通过反射获得注解信息
@Target
注解用来约束自定义注解可以注解Java的哪些元素:
- @Target({ElementType.METHOD})
- public @interface MyAnnotation {
- String value();
- }
上面的代码表示Myannotation这个注解只能注解类的方法
- ElementType.CONSTRUCTOR 用于描述构造器
- ElementType.FIELD 用于描述域
- ElementType.LOCAL_VARIABLE 用于描述局部变量
- ElementType.METHOD 用于描述方法
- ElementType.PACKAGE 用于描述包
- ElementType.PARAMETER 用于描述参数
- ElementType.TYPE 用于描述类、接口(包括注解类型) 或enum声明
@Inherited
注解表示当前注解会被注解类的子类继承
如果一个父类被注解修饰了,则它的子类会继承注解
@Documented
的作用是告诉JavaDoc工具,当前注解本身也要显示在java Doc中。
四、自定义注解
自定义一个注解和定义类、接口相似,是同等级的。
例子:
定义注解:
- @interface MyAnnotation {
- String value();
- String name();
- int age();
- String[] newNames();
- }
五、使用注解:通过反射机制
例子://自定义一个注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
public String name();
public String value();
}
//用注解修饰一个类
@MyAnnotation(name = "hello name",value = "hello value") class MyClass {
}
public class test {
public static void main(String[] args) {
//通过反射获得MyClass的注解信息
MyAnnotation myAnnotation=MyClass.class.getAnnotation(MyAnnotation.class);
System.out.println(myAnnotation.name());
System.out.println(myAnnotation.value());
}
}