注解就如同标签一样。
1、注解的定义
//注解的定义,相当于创建了一个名字为Frozen的标签
public @interface Frozen{}
2、注解的应用
上面我们定义了一个注解标签 下面我们将标签贴在方法上
@Frozen
public static void getSomthing(){}
将标签贴在类上
@Frozen
public class UseZhujie {
}
3、注解的工作原理
上面我们创建了注解,并把他贴在了某处,但是这货是怎么工作的呢?
首先呢,我们必须先了解元注解。 所谓元注解,在笔者看来就是注解的基本组成部分,元注解组成注解,是注解里的基本单位。
【5种元注解】 ** A、@Retention** 这个注解就是确定注解的存活时间的,也就是常说的生命周期。
RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。 RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。 RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
** B、@ Documented** 它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。 C、@ Target 限制注解的应用场景,就是规定当前的注解可以贴在什么地方 ElementType.ANNOTATION_TYPE 可以给一个注解进行注解 ElementType.CONSTRUCTOR 可以给构造方法进行注解 ElementType.FIELD 可以给属性进行注解 ElementType.LOCAL_VARIABLE 可以给局部变量进行注解 ElementType.METHOD 可以给方法进行注解 ElementType.PACKAGE 可以给一个包进行注解 ElementType.PARAMETER 可以给一个方法内的参数进行注解 ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举 D、@ Inherited 继承,也就是说。 ClassA的注解被@Inherited修饰之后,假设ClassB extends ClassA 那么ClassB也具有与ClassA被修饰过的一样的注解了。 E、@ Repeatable Java1.8新特性
4、注解的属性
public @interface Frozen{
String frozen();
int redant();
}
//应用刚创建的注解
@Frozen(frozen = "hoyl", redant = 0)
public static void getSomthing(){}
** 可以添加属性默认值**
public @interface Frozen{
/* String frozen();
int redant();*/
//可以设置默认值
String frozen() default "Frozen";
int redant() default 100;
}
这样被贴标签的就不用了赋值了
//@Frozen(frozen = "hoyl", redant = 0)
@Frozen
public static void getSomthing(){}
5、Java预置注解
这些呢,大多数是编译器自动感知。然后报警告,提示自动添加的。 @ Deprecated 这是告诉开发者,调用的东西过时了
@ Override 想重写父类的方法 @ SuppressWarnings 一些警告 @ SafeVarargs 阻止编译器产生 unchecked警告 @ FunctionalInterface 1.8新特性
6、注解有啥用?
1、生成文档。 2、跟踪代码依赖性,实现替代配置文件XML功能。 3、在编译时进行格式检查。