注解也被称为元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们在稍后某个时刻非常方便地使用这些数据 。
最常见的就是@override注解,表示覆盖超类中的方法。
@SuppressWarning关闭不当的编译器警告信息。
一个注解例子:
@Target(ElementType.METHOD)
// 该注解用于什么 地方
@Retention(RetentionPolicy.RUNTIME)
// 需要在什么级别保存注解信息
public @interface Test {
public int id();// 自定义的一个"方法"
public String description() default "no descritation";// 注解描述,有一个默认值
}
如何使用?
package test;
public class Demo {
public static void main(String[] Args) {
new Demo().test();
}
@Test(id = 0, description = "测试~~")
public void test() {
}
}
三种标准注解
@Target
可用的有构造器的声明(CONSTRUTOR)、局部变量声明(LOCAL_VARIALBE)、方法声明(METHOD)、包声明(PACKAGE)、参数声明(PARAMETER)、类接口或enum声明(TYPE)
@Retention
级别有三:
注解会被编译器丢弃(SOURCE)
注解在class文件中可用,但会被vm丢弃(CLASS)
vm将在运行期也保留注解,因此可以通过反射机制读取注解信息(RUNTIME)
@Decumented
将此注解包含在Javadoc中
@Inherited
允许被子类继承
注解的应用
package test;
import java.lang.reflect.Method;
public class Demo {
@Test(id =2, description = "测试~~")
public static void main(String[] Args) {
new Demo().test0();
}
@Test(id = 0, description = "测试~~")
public void test() {
}
@Test(id = 3, description = "测试~~")
public void test0() {
Method[] m = getClass().getDeclaredMethods();
// Test t=m[0].getAnnotation(Demo.class);
for (Method method : getClass().getDeclaredMethods()) {
Test t = method.getAnnotation(Test.class);
System.out.println(t.description() + "********" + t.id());
}
}
}
注解中不允许NULL作为它的默认值,如Description和id,如果想表现一个元素的存在或者缺失则最好用负数或者""。
通过这些了解我们如果对java中的反射机制有一定了解那么可以很轻松的运用到我们的项目中,比如通过编写一个sql的注解,在编写一个javabean的时候可以通过注解来写一个程序用于生成sql语句,或者写一个test注解用于执行单元测试。有一个基于注解的测试框架叫net.mindview.atunit.网上有jar包,不过调 了半天也没调 出来 。没法用。
也许在新版本中被替代了?Junit还是很好用的。
添加Test注解的时候,run as unit test就可以了,只执行test注解的方法 。