十四、注解
基本内置注解
public class Txt {
public static void main(String[] args) {
test();
}
//@Override用在方法上,表示这个方法重写了父类的方法
@Override
public String toString() {
return super.toString();
}
//@Deprecated 表示这个方法已经过期,不建议开发者使用.(将来某个版本,就有可能会取消掉)
@Deprecated
public static void test(){
}
/**
* 1.deprecation:使用了不赞成使用的类或方法时的警告(使用@Deprecated使得编译器产生的警告);
* 2.unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型; 关闭编译器警告
* 3.fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
* 4.path:在类路径、源文件路径等中有不存在的路径时的警告;
* 5.serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告;
* 6.finally:任何 finally 子句不能正常完成时的警告;
* 7.rawtypes 泛型类型未指明
* 8.unused 引用定义了,但是没有被使用
* 9.all:关于以上所有情况的警告。
*/
//@SuppressWarnings Suppress英文的意思是抑制的意思,这个注解的用处是忽略警告信息
@SuppressWarnings("all")
public static void test2(){
}
}
//函数式接口
@FunctionalInterface
interface test3{
public void t();
}
元注解
元注解(metadata)就是注解的注解,主要是给自定义注解用的
//@Target 表示这个注解能放在什么位置上,例@Target({METHOD,TYPE})
/**参数:
* ElementType.TYPE:能修饰类、接口或枚举类型
* ElementType.FIELD:能修饰成员变量
* ElementType.METHOD:能修饰方法
* ElementType.PARAMETER:能修饰参数
* ElementType.CONSTRUCTOR:能修饰构造器
* ElementType.LOCAL_VARIABLE:能修饰局部变量
* ElementType.ANNOTATION_TYPE:能修饰注解
* ElementType.PACKAGE:能修饰包
*/
//@Retention 表示生命周期,例@Retention(RetentionPolicy.RUNTIME)
/**
* RetentionPolicy.SOURCE: 注解只在源代码中存在,编译成class之后,就没了。@Override 就是这种注解。
* RetentionPolicy.CLASS: (默认值)注解在java文件编程成.class文件后,依然存在,但是运行起来后就没了。
* RetentionPolicy.RUNTIME: 注解在运行起来之后依然存在,程序可以通过反射获取这些信息,
*/
//@Inherited 表示该注解具有继承性
//@Documented 表示在用javadoc命令生成API文档后,文档里会出现该注解说明
//@Repeatable (java1.8 新增) 使用@Repeatable之后,再配合一些其他动作,就可以在同一个地方使用多次了。
自定义注解
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
public class Txt {
public static void main(String[] args) {
//通过反射,获取TestClass类的注解信息
MyAnnotation annotation = TestClass.class.getAnnotation(MyAnnotation.class);
int id= annotation.id();
String name = annotation.name();
int age = annotation.age();
int salary = annotation.salary();
System.out.printf("%d,%s,%d,%d",id,name,age,salary);
}
}
//使用注解
@MyAnnotation(id = 10,name = "张三",age = 23,salary = 15000)//类似与python的关键自传参
class TestClass{
}
//自定义注解
@Target({METHOD,TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@interface MyAnnotation{
//注解元素里有一个元素,可以使用value,这个再引用注解时可以省略value=
//固参数定格式:参数类型 参数名();
int id();//这种带括号的不是方法,是固定格式
String name();
int age();
int salary() default 20000;//带默认值
}