张龙 Annotation学习笔记1
首先明确一个概念:
annotation=注解 comment=注释 不要混淆了
a) Override注解表示子类要重写(override)父类的对应方法。
举例:OverrideTest.java
package com.shengsiyuan.annotation; public class OverrideTest { @Override //该注解表示该类重写了父类的方法 public String toString() { return "This is OverrideTest"; } public static void main(String[] args) { OverrideTest test = new OverrideTest(); System.out.println(test); } }
b) Deprecated注解表示方法是不建议被使用的。
举例:DeprecatedTest.java
package com.shengsiyuan.annotation; public class DeprecatedTest { @Deprecated //该注解表示这个方法是废弃的,不建议被使用的 public void doSomething() { System.out.println("do something!"); } public static void main(String[] args) { DeprecatedTest test = new DeprecatedTest(); test.doSomething(); // Date date = new Date(); // // System.out.println(date.toLocaleString()); } }
c) SuppressWarnings注解表示抑制警告。
举例:SuppressWarningsTest.java
package com.shengsiyuan.annotation; import java.util.Date; import java.util.Map; import java.util.TreeMap; public class SuppressWarningsTest { @SuppressWarnings({"unchecked", "deprecation"}) //该注解表示一些警告会被压制住 //unchecked表示不对集合没有使用泛型进行警告 //deprecation表示不对已经废弃的方法的使用进行警告 public static void main(String[] args) { Map map = new TreeMap(); map.put("hello", new Date()); System.out.println(map.get("hello")); Date date = new Date(); System.out.println(date.toLocaleString()); } }
关于自定义注解
自定义注解:当注解中的属性名为value时,在对其赋值时可以不指定属性的名称而直接写上属性值即可;除了value以外的其他值都需要使用name=value这种赋值方式,即明确指定给谁赋值。
举例如下:
(1)先定义一个注解
package com.shengsiyuan.annotation; public @interface AnnotationTest { //注解里定义属性要在属性后面加一个括号 String[] value1() default "hello";//有一个默认值hello EnumTest value2(); //注解里面的值也可定义为枚举类型 } enum EnumTest { Hello, World, Welcome; }
注意:当一个接口继承Annotation接口时,该接口依然只是一个接口,还不是注解类型,
要定义注解类型只有一种方式:通过@interface关键字,除此之外别无他法。
另外,Annotation本身也只是一个接口,并不是注解类型(可以查看API文档有 Annotation这个接口)
(2)引用上面的注解
package com.shengsiyuan.annotation; @AnnotationTest(value2 = EnumTest.Welcome) public class AnnotationUsage { @AnnotationTest(value1 = {"world", "ABCD"}, value2 = EnumTest.World) public void method() { System.out.println("usage of annotation"); } public static void main(String[] args) { AnnotationUsage usage = new AnnotationUsage(); usage.method(); } }
最后有一点需要注意的是:
当我们使用@interface关键字定义一个注解时,该注解隐含地继承了java.lang.annotation.Annotation接口;如果我们定义了一个接口,并且让该接口继承自Annotation,那么我们所定义的接口依然还是接口而不是注解;Annotation本身是接口而不是注解。可以与Enum类比。