mixpplus
11/18/2019 - 7:03 AM

注解

基本注解:
@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()) ;
			}
		}
	}
}