注解
注解
什么是注解
- 注解是从JDK5.0开始引入的新技术
- 注解的作用:
-
与注释作用相同,可以对程序做出解释
-
可以被其他程序(如编译器)读取
- 注解的格式:以“@注释名”在代码中存在,还可以添加一些参数值
- 注解的应用范围:可以附加在package,class,method,field等上面,相当于给它们添加了额外的辅助信息,可以通过反射机制编程实现对这些元素的访问
内置注解
- @Override:只是用于修辞方法,表示一个方法声明打算重写超类中的另一个声明
- @Deprecated:可以用于修辞方法,属性,类,表示不建议使用
- @SuppressWarnings:用来抑制编译时的警告信息。需要添加参数
package annotation;
//抑制编译警告
@SuppressWarnings("all")
public class Test01 {
//重写的注解,有检查功能
@Override
public String toString() {
return "Test01{}";
}
//不推荐程序员使用,
@Deprecated
public static void test(){}
public static void main(String[] args) {
}
}
元注解
- 元注解的作用:负责注解其他的注解
- 元注解的种类:
-
@Target:用于描述注解的使用范围
-
@Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE < ClASS < RUNTIME)
-
@Document:说明该注解将被包含在JavaDoc中
-
@Inherited:说明子类可以继承父类中的注解
package annotation;
import java.lang.annotation.*;
//测试元注解
public class Test02 {
@MyAnnotation
public static void test(){}
public static void main(String[] args) {
test();
}
}
//定义一个注解
//Target:表示注解可以用在那些地方
@Target(value = {ElementType.METHOD, ElementType.TYPE})
//Retention 表示注解在什么地方有效
@Retention(value = RetentionPolicy.RUNTIME)
//表示是否将注解生成到JavaDoc中
@Documented
//Inherited 子类继承父类的注解
@Inherited
@interface MyAnnotation{
}
自定义注解
- 使用@interface自定义注解,自动继承了java.lang.annotation.Annotation接口
- 特点:
-
public @interface注解名
-
其中的每一个方法实际上是声明了一个配置参数
-
方法的名称就是参数的名称
-
返回值类型就是参数的类型,返回值只能是基本类型
-
可以通过default来声明参数的默认值
-
如果只有一个参数成员,一般参数名为value,传参时可以不写参数名
-
注解元素必须要有值,定义注解元素时,经常使用空字符串,0为默认值
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//自定义注解
public class Test03 {
//注解可以有默认值,如果没有默认值,必须给注解赋值
@MyAnnotation2(name = "sml", schools = {"大连理工大学"})
public static void test2(){}
@MyAnnotation3("sml")
public static void test3(){
}
public static void main(String[] args) {
test2();
test3();
}
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
//注解的参数:参数类型 + 参数名 + ()
String name() default "";
int age() default 0;
int id() default -1; //如果默认值为-1,代表不存在
String[] schools();
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{
String value();
}