基本注解:
@Override
@Deprecated
@SuppressWarnings
@SafeVarargs
@FunctionalInterface
这五个注解都定义在java.lang包下。
@Override: 限定重写父类方法,只能修饰方法;
强制子类必须重写父类方法,可以避免重写父类方法时,方法名写错,引起不必要的麻烦。
@Deprecated:用于表示某个程序元素(类、方法等)已经过时,当其他程序使用已过时的类或者方法时,
编译器会给出警告。
java9为@Deprecated注解增加了两个属性
forRemoval: 该boolean类型的属性指定该API在将来是否会删除。
since:该String类型的属性指定该API从哪个版本被标记为过时。
举例:
@Deprecated(since="9",forRemoval=true) public void info(){...};
该api在jdk9版本中被标记为过时,在将来会被删除。
@SuppressWarnings:抑制编译器警告
该注解会一直作用于程序元素的所有子元素,如果注解在类中,则会取消该类中所有的警告信息。
使用@SuppressWarnings注解来关闭编译器警告时,一定要在括号中使用name=value的形式
为该注解的成员变量设置值。
注解参数:
unchecked (抑制没有进行类型检查操作的警告)
unused (抑制没被使用过的代码的警告)
all (抑制所有警告)
堆污染警告与java9增强的@SafeVarargs
当把一个不带泛型的对象赋值给一个带泛型的变量时,往往就会出现堆污染。
对于形参个数可变的方法,该形参的类型又是泛型,就更容易导致堆污染。
个数可变的形参相当于数组,java中不支持泛型数组,因此可变长泛型形参只能当成
List[]处理。
public void method(List<String>...listStrArray){
List[] listArray = listStrArray;
...
}
java8的函数式接口与@FunctionalInterface
该注解用来指定某个接口必须是函数式接口。只能用来修饰接口。
函数式接口:接口中只有一个抽象方法(可以包含多个默认方法,或者多个static方法。)
jdk中提供的注解:
@Override 描述子类重写父类的方法
@SuppressWarnings 压制警告
@Deprecated 描述方法过时
jdk中提供的元注解:
@Documented
它表示使用此注解标注的自定义注解再通过javadoc工具生成API文档的时候
会出现在API文档里面。举个例子@Deprecated 这个注解再Java中非常常见
@Target 指定的是注解的使用目标
值:在ElementType枚举类中
TYPE 类
FIELD 成员变量
METHOD 成员方法
PARAMETER 参数
CONSTRUCTOR 构造器
LOCAL_VARIABLE 局部变量
ANNOTATION_TYPE 注解
PACKAGE 包
TYPE_PARAMETER 类型参数
TYPE_USE 任何类型
@Retention 可以理解为保留时间(生命周期)
一般注解处于源码阶段, 使用本元注解可以延长注解的生命周期
值:在 RetentionPolicy枚举类中
SOURCE 源码阶段
CLASS 字节码阶段
RUNTIME 运行阶段
@Inherited
被@Inherited元注解标注的注解,在使用的时候表示该注解可以被子类继承
举例: A类被@Test注解, 如果@Test注解被@Inherited修饰,那么A类的子类也会被@Test修饰。
自定义注解:
格式:数据类型 属性名称() [default 默认值];
注意: 属性名称后面有括号 可以设置默认值,如果属性没有默认值使用该注解的时候一定要显示指定。
自定义注解举例:
// 定义了一个注解
public @interface Anno1 {
// 基本数据类型
public int a() default 23;
// String类型
public String name() default "张三" ;
// Class类型
public Class clazz();
// 注解类型
public Anno2 anno();
// 枚举类型
public Season season() default Season.SPRING ;
// 以上类型的一维数组
public Season[] seasons() default { Season.SPRING ,
Season.SUMMER } ;
//这是一个特殊的属性名称,如果在使用注解的时候, 只出现了给value属性
赋值,那么value可以直接省略
public String value() ;
}
自定义注解 案例举例:
@Retention(value = RetentionPolicy.RUNTIME) // 提升该注解的生命周期为运行时
public @interface Test {
}
public class AnnoDemo01 {
public static void main(String[] args) throws
IllegalAccessException, InstantiationException,
InvocationTargetException {
// 获取到使用类的Class对象
Class<UseTest> useTestClass = UseTest.class;
// 通过反射获取所有的方法对象
Method[] methods = useTestClass.getDeclaredMethods();
// 遍历方法对象数组,获取每一个方法对象
for(Method method : methods) {
// 判断该方法上是否存在@Test
if(method.isAnnotationPresent(Test.class)){
method.invoke(useTestClass.newInstance()) ;
}
}
}
}