Java:注解Annotation
注解Annotation
注解的概念
- JDK5.0 中引入
- Annotation的作用:
- 不是程序本身,可以对程序做出解释(与注释comment相似)
- 可以被其他程序(如编译器)读取
- Annotation的格式:
@注释名
,还可以添加一些参数值,如@SuppressWarnings(value="unchecked")
- 使用位置:
- 可以在package, class, method, field等位置,相当于添加了额外的辅助信息,可以通过反射机制编程实现访问
注解具有检查和约束的功能
public class Test01{
//重写的注解
@Override
public String toString() {
return super.toString();
}
}
内置注解
@Override
:定义在java.lang.Override中,只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法@Deprecaated
:定义在java.lang.Deprecated中,可用于修饰方法、属性、类。表示不鼓励使用这样的元素,已过时的(通常是不安全或有更好的选择)@SuppressWarnings
:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息,需要添加参数才能使用,使用之后不会提出警告@SuppressWarnings("all")
@SuppressWarnings("unchecked")
@SuppressWarnings(value={"unchecked","deprecation"})
- ……
元注解(用于描述自定义注解)
- 元注解:用于注解其他注解,属于java.lang.annotation
@Target
:用于描述注解的适用范围(可以使用在什么地方@Retention
:表示需要在声明级别保存该注解信息,用于描述注解的生命周期- SOURCE < CLASS < RUNTIME:一般都定义RUNTIME
@Document
:说明该注解将被包含在javadoc中@Inherited
:说明子类可以继承父类中的该注解
@MyAnnotation //自定义注解可以在类中使用
public class Test02 {
}
//定义一个注解,参数查看源码
//Target 表示注解可以用在什么地方
@Target(value = {ElementType.METHOD,ElementType.TYPE})
//Retention 表示注解在什么地方有效,一般使用RUNTIME>CLASS>SOURCE
@Retention(value = RetentionPolicy.RUNTIME)
//Documented 表示是否将注解生成在Javadoc中
@Documented
//Inherited 子类可以继承父类的注解
@Inherited
//注解的定义
@interface MyAnnotation{
}
自定义注解
@interface
自定义注解时自动继承java.lang.annotation.Annotation接口
(public) @interface 注解名 {定义内容}
:自定义注解- 注解中的方法实际上是用于声明配置参数
- 方法的名称是参数的名称
- 返回值的类型是参数的类型(返回值只能是基本类型,class,String,enum)
- 可以通过default声明参数的默认值
- 如果只有一个参数成员,一般参数名为value,使用时可以省略
- 注解元素必须有值,定义时常用空字符串、0作为默认值
public class Test03 {
//注解可以显示赋值,如果没有默认值,就必须给注解赋值
@MyAnnotation2(name = "chachan53")
public void test(){}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
//注解的参数:参数类型 + 参数名();
String name() default "";
int age() default 0;
int id() default -1;//如果默认值为-1,代表不存在
String[] schools() default {"A","B"};
}
只有一个参数成员时:
public class Test03 {
//注解可以显示赋值,如果没有默认值,就必须给注解赋值
@MyAnnotation3("test1")
public void test2(){}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{
String value();
}