注解,可以看作是对 一个 类/方法 的一个扩展的模版,每个 类/方法 按照注解类中的规则,来为 类/方法 注解不同的参数,在用到的地方可以得到不同的 类/方法 中注解的各种参数与值
注解也就是Annotation,相信不少人也和我之前一样以为和注释和doc一样,是一段辅助性的文字,其实注解不是这样的。
从JDK5开始,java增加了对元数据(描述数据属性的信息)的支持。其实说白就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进
java提供了5个基本的注解,分别是:
1.@Override
2.@Deprecated
3.@SuppressWarnings
4.@SafeVarargs
5.@FunctionalInterface
想理解这个就要明白什么是堆污染,堆污染是什么?其实很好理解,就是把不带泛型的对象赋给一个带泛型的对象,为什么不行?很简单,因为不带泛型的话,默认会给泛型设定为object,意思就是什么类型都可以往里面塞,那你一个不带泛型的怎么可能给一个带泛型塞呢。
注意:可变参数更容易引发堆污染异常,因为java不允许创建泛型数组,可变参数恰恰是数组。
抑制这个警告的方法有三个:
1.@SafeVarargs修饰引发该警告的方法或构造器
2.使用@suppressWarnings(“unchecked”)
3.编译时使用-Xlint:varargs
什么是函数式?如果接口中只有一个抽象方法(可以包含多个默认方法或多个static方法)
接口体内只能声明常量字段和抽象方法,并且被隐式声明为public,static,final。
接口里面不能有私有的方法或变量。
这个注解有什么用?这个注解保证这个接口只有一个抽象方法,注意这个只能修饰接口
代码示例1:
package Demo01; import java.awt.*; //什么是注解 public class Test01 extends Object { // @Override 重写的注解 @Override public String toString() { return super.toString(); } //不推荐程序员使用,但是可以使用 或者存在更好的方式 @Deprecated public static void test(){ System.out.println("@Deprecated"); } @SuppressWarnings("all") public void test02(){ List list=new List(); } public static void main(String[] args) { test(); } }
代码示例2:
package Demo01; import java.lang.annotation.*; //测试元注解 @MyAnnotation public class Test02 { public void test(){ } } //定义一个元注解 //Target 表示我们的注解可以用在哪些地方 @Target(value ={ElementType.METHOD,ElementType.TYPE}) //@Retention 表示我们的注解在哪些地方有效 //(SOURCE<CLASS<RUNTIME) @Retention(value = RetentionPolicy.RUNTIME) //@Documented 表示我们的注解是否生成在Javadoc中 @Documented //@Inherited 表示子类可以继承父类的注解 @Inherited @interface MyAnnotation{ }
代码示例3:
package Demo01; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //测试自定义注解 public class Test03 { //注解可以显示定义,如果没有默认值,我们就必须给注解赋值 @MyAnnotation2(schools = {"xx大学"}) //若有默认值default 可以不加name="你好" public void test(){ } @MyAnnotation3("你好") //只有一个值的情况 public void test2(){} } @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation2{ //注解的参数:参数类型+参数名() String name() default ""; int age() default 0; int id() default -1;//如果默认值为-1 代表不存在。indexof--如果找不到就返回-1 String[] schools() default {"北华"}; } @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation3{ String value(); //只有一个值的情况 }