注解
什么是注解?
注解是可以被程序(比如:编译器等)解读的,和注释的区别就是注释不可以被程序解读
内置注解:
@SuppressWarnings: 用来抑制编译时的警告信息,(如果方法未使用方法名将会变为灰色,这就是警告)
@Deprecated:不推荐使用,通常是因为很危险或者存在更好的方式
@Override:表示一个方法声明打算重写父类的一个方法
注解在哪使用?
Annotation可以附加在package,class,method,field等上面,相当于给他们添加了额外的辅助信息
我们可以通过反射机制编程实现对这些元数据的访问
内置注解代码测试
@SuppressWarnings("all")
public class Test01 {
@Override
public String toString() {
return super.toString();
}
@Deprecated
public static void test(){
System.out.println("过时;");
}
@SuppressWarnings("all")
public void test02(){
}
public static void main(String[] args) {
test();
List list = new ArrayList();
}
}
元注解
元注解作用
负责注解其他注解,Java定义了4个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明
元注解的类型
这些类型包括:@Target,@Retention,@Document,@Inherited
(重要)@Target:用于描述注解的使用范围(即用来描述注解可以用在什么地方
一般用于TYPE(类),METHOD(方法)上面
(重要)@Retention:表示要在什么级别保存该注释信息,用于描述注解的生命周期
SOURCE<CLASS<RUNTIME(一般使用RUNTIME,因为级别最高,代表在源码,在class字节码文件中都有用)
@Document:说明该注解将会被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
自定义注解
如何自定义注解?
使用@interface声明自定义注解,自动继承了java.lang.annotation.Annotation接口
分析:
@interface用来声明一个注解,格式:public @interface 注解名{定义内容}
其中的每一个方法实际上就是声明了一个配置参数
方法的名称就是参数的名称
返回值类型就是参数的类型(返回值只能是基本类型,Class,String,enum)
可以通过default来声明默认参数值
如果只有一个参数成员,一般参数名为value
注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值
代码测试
@MyAnnotation
public class Test02 {
@MyAnnotation(name="yuan")
public void test(){ }
@MyAnotation2({"你","我"})
public void test2(){ }
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@interface MyAnnotation{
String name() default "";
int age() default 0;
int id() default -1;
String[]schools() default {"新余学院","清华大学"};
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnotation2{
String[] value() default {};
}