注解用处
注解( 也被成为元数据 ) 为我们在代码中添加信息提供了一种形式化的方法, 使我们在稍后的某个时刻非常方便的使用这些数据, 注解有下面这些特性:
- 注解的语法比较简单, 除了 @ 符号外, 基本与 java 固有语法一致
- 注解的快捷方式: 注解中有名字为 value 的元素, 在使用的时候, 如果该元素是唯一需要赋值的, 只需要在括号内给出该元素的值即可, 无需使用键值对的方式赋值
- java 只内置了三种标准注解及四种元注解
- 标准注解: @Override, @Deprecated, @SuppressWarings
- 元注解(专门负责新注解的创建)
- @Target: 表明注解可以使用在哪些地方
- @Retention: 定义注解可以在那一级别使用
- @Documented: 将此注解包含在 Javadoc 中
- @Inherited: 允许子类继承父类中的注解
什么时候使用注解呢? 注解在一定程度上把元数据和源代码结合在一起, 而不是把数据保存在外部配置文件中. 所以当创建描述符性质的类或者接口时, 一旦其中包含了重复性的工作, 可以考虑使用注解来简化和自动化该过程.
如何定义一个注解
注解的定义很像 Java 接口的定义, 实际上, 注解也将被编译成 Class 文件
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{
}
除了 @ 符号外, @Test 很像一个空的接口. 这个注解方法体内没有任何元素, 称为标记注解. 并且注解可以嵌套一个注解
// 注解的使用
public class Testable {
@Test void testExecute() {
System.out.pritln("Executing..");
}
}
注解的使用方法和修饰符的使用一模一样, 例如: pulblic、void、static 等,
了解注解是如何定义后, 聪明的读者可能会问了, 注解是如何如何起作用的呢? 是如何按照我们的想要的功能区实现相应的目的呢?这个问题交给注解处理器来时回答吧
注解处理器
如果没有用来读取注解的工具, 那注解也不会比注释更有用. 举一个不是很恰当的例子, 我们的目的是做一个汉堡, 注解的作用准备汉堡的一系列原材料, 注解处理器就类似于烹饪的过程. 只有注解的话, 不会比一个烧火棍更有用
注解处理器是通过反射机制实现的.
一般来说, 注解都会包含一些元素来表示某些值. 并且这些元素不能有不确定的值, 要么是默认值, 要么是在使用的时候提供值. 当注解处理器处理注解时, 可以使用这些值.
运行时注解处理器
-
定义一个注解
// 作用于方法上, 给当前被注解的方法返回输入的值 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface Get { String value() default ""; }
-
使用 @Get 注解
public class AnnotationTest { @Get(value = "http://ip.taobao.com") public String getIpMsg() { return ""; } @Get(value = "192.168.9.23") public String getIp() { return ""; } }
-
编写代码处理器, 获取 Get 的值
public class AnnotationProcessor { public static void main(String[] args) { Method[] methods = AnnotationTest.class.getDeclaredMethods(); for (Method m : methods) { Get get = m.getAnnotation(Get.class); System.out.println(get.value()); } } }
-
输出
http://ip.taobao.com/59.108.54.37 http://ip.taobao.com/