Java 注解与注解处理器
注解( 也被成为元数据 ) 为我们在代码中添加信息提供了一种形式化的方法, 使我们在稍后的某个时刻非常方便的使用这些数据, 注解有下面这些特性:
什么时候使用注解呢? 注解在一定程度上把元数据和源代码结合在一起, 而不是把数据保存在外部配置文件中. 所以当创建描述符性质的类或者接口时, 一旦其中包含了重复性的工作, 可以考虑使用注解来简化和自动化该过程.
注解的定义很像 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/