注解

注解是程序的增强器,使用注解可以使得代码更简单高效。

注解的分类

  1. JDK注解
  2. 元注解
  3. 自定义注解

JDK注解

注解 功能
@Override 标识重写方法
@Deprecated 标记就表明这个方法已经过时了
@SuppressWarnings(“deprecation”) 忽略警告
@SafeVarargs jdk1.7出现,堆污染,不常用
@FunctionallInterface jdk1.8出现,配合函数式编程拉姆达表达式,不常用

元注解

注解语法与Java不同,注解使用元注解定义。

元注解:用于定义注解的注解。

注解 功能
@Target 标记注解用在哪里:类上、方法上、属性上等等
@Retention 标记自定义注解的生命周期:源文件中、字节码文件中、运行中
@Inherited 允许子注解继承
@Documented 生成javadoc时会包含注解,不常用
@Repeatable 注解为可重复类型注解,可以在同一个地方多次使用,不常用

@Target注解

描述注解存在的位置:

ElementType.TYPE 应用于类的元素
ElementType.METHOD 应用于方法级
ElementType.FIELD 应用于字段或属性(成员变量)
ElementType.ANNOTATION_TYPE 应用于注释类型
ElementType.CONSTRUCTOR 应用于构造函数
ElementType.LOCAL_VARIABLE 应用于局部变量
ElementType.PACKAGE 应用于包声明
ElementType.PARAMETER 应用于方法的参数

@Retention

定义注解被保留时间长短

SOURCE 在源文件中有效(即源文件保留)

CLASS 在class文件中有效(即class保留)

RUNTIME 在运行时有效(即运行时保留)

自定义注解

1.通过@Target表示自定义住的@Test可使用位置
使用”ElementType.“的方式自定义使用位置,多个值使用{,}的格式
例如:@Target({ElementType.METHOD,ElementType.TYPE})
2.通过@Retention表示自定义注解@Test的生命周期
使用”RetentionPolicy.“的方式指定自定义注解的生命周期
例如:@Retention(RetentionPolicy.CLASS)
SOURCE:源文件中,CLASS:字节码文件中,RUNTIME:运行时
只能使用一个,不可同时使用多个

示例代码

  1. package cn.tedu.annotation;
  2. import javax.xml.transform.Source;
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7. /**
  8. * 实现自定义注解
  9. */
  10. public class TestAnnotation {
  11. public static void main(String[] args) {
  12. }
  13. }
  14. /*
  15. 注解定义格式:@interface 注解名
  16. 1.通过@Target表示自定义住的@Test可使用位置
  17. 使用"ElementType."的方式自定义使用位置,多个值使用{,}的格式
  18. 例如:@Target({ElementType.METHOD,ElementType.TYPE})
  19. 2.通过@Retention表示自定义注解@Test的生命周期
  20. 使用"RetentionPolicy."的方式指定自定义注解的生命周期
  21. 例如:@Retention(RetentionPolicy.CLASS)
  22. SOURCE:源文件中,CLASS:字节码文件中,RUNTIME:运行时
  23. 只能使用一个,不可同时使用多个
  24. */
  25. @Target({ElementType.METHOD})
  26. @Retention(RetentionPolicy.CLASS)
  27. @interface Test{
  28. /*
  29. 添加注解属性
  30. int play();不是方法的定义,而是自定义注解中定义age属性
  31. */
  32. int play() default 0;
  33. /*
  34. 可以添加特殊属性value(固定名称)
  35. 定义格式与普通属性相同,主要区别在于使用时可以直接赋值,
  36. 例如:@Test("Code"),不需要写成@Test(value = "Code")
  37. 自定义注解类中给特殊属性value赋予默认值时的格式不可简写
  38. */
  39. //String value();
  40. String value() default "lemon";
  41. }
  42. /*
  43. 注解的使用
  44. 在自定义注解名字前加"@"即可使用
  45. */
  46. //@Test
  47. class TestAno{
  48. /*
  49. 测试1:分别给TestAno类、name属性、play方法都添加@Test注解,不报错
  50. 测试2:将ElementType.TYPE,ElementType.FILED删除,只有方法上的注解不报错
  51. 结论:自定义注解可以使用位置,由@Target的值
  52. */
  53. //@Test
  54. String name;
  55. /*
  56. 测试3:添加注解属性play后,将会报错
  57. 结论:当注解没有定义属性时可以直接使用,添加属性后,必须给属性赋值。
  58. 测试4:给@Test的play属性赋值后,不会报错。
  59. 结论:给属性赋值格式:@Test(play = 1120),不能直接赋值。
  60. 使用注解时可以给属性指定默认值,指定后便可不赋值直接使用。
  61. 格式:int play() default 0;
  62. 测试5:给play属性添加默认值后可直接使用注解,不需要赋值
  63. 测试6:给特殊属性value负值时可以简写,相当于(value = "apple")
  64. 测试7:两个属性都已经有默认值,可以直接使用@Test
  65. */
  66. //@Test(play = 1120)
  67. @Test("Code")
  68. public void play(){
  69. System.out.println("吃什么火锅,写代码不好吗?");
  70. }
  71. }