黑马程序员-Java高新技术_注解视频学习笔记
个人理解注解类似c/c++里的预编译,都是编译时候要做的一些动作(java新特性),但java里的注解跟预编译是有很大的不同的。注解相当于一种标记,加了注解相当于加了某种标记,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记去做相应的事情。标记可以加在类,方法,包,字段,方法参数及局部变量上。
//基本的三个注解 @SuppressWarnings("deprecation") //忽略特定错误 @Deprecated //表示作用的方法已过时。 @Override //表示作用的方法必须覆盖父类,如果我们不小心写 错方法了没有覆盖父类的方法编译会帮我们保错,这样可以避免一些bug。
注解相当与你的源程序调用了一个类,要在源程序中应用某注解,得先准备好这个注解类。就像你要调用某个类,得先开发出这个类。下面有代码演示这个过程:
//定义注解类 @interface A {} //应用注解类 @A class B {} //对“应用了注解的类”,进行反射操作的类 Class C { B.class.isAnnotionPresent(A.class); A a = B.class.getAnnotion(A.class); }
元注解:注解的注解。经常看it书会看到元数据,元属性的词,他们的意思是数据的数据,属性的属性。在定义注解的时候需要元注解的作用。
// 注解的存在分为三个阶段,源程序---->class文件----->字节码(class文件里的不是字节码,虚拟机加载类后经过转换才产生字节码) //用@Retention元注解说明定义的注解的生命周期在哪个阶段。默认是保存到class阶段。 // 让定义的注解保持到运行时。 @Retention(RetentionPolicy.RUNTIME) //注解作用的对象分为,类,方法,包,字段,方法参数及局部变量,可以用@Targer元注解说明 //定义注解可以用在类和方法上,这里ElementType.TYPE的TYPE命名比CLASS更准确,Class,枚举、注解等这些都是类型。 //定义为这个注解可以用在以上这些类型上而不只是类。 @Targer({ElementType.METHOD,ElementType.TYPE}) //为注解添加属性、 @Interface A { String color() defualt "blue"; } //设置注解属性 @A(color="red")
知识点1:注解中属性返回值的类型,不能是普通类类型。只能是:8种基本类型、String、Class、Enum、Annotation和这些类型的数组。
知识点2:使用哈希集合的时候注意添加的对象的类定义equals方法时参数的类型必须是object,因为哈希集合在计算对象哈希值时调用的是这个规格的equals方法,如果一不小心参数类型用本类类型,就会产生一个重载的equals方法,而哈希集合计算哈希值时调用的是参数为object类型的equals这样就调用的是父类object的equals,这样就产生的bug很难被发现。可以在定义这类方法时用@Override注解,帮助我们检测。