Annotation 注释,这个注释和写代码时解释代码在干什么那个注释完全不是一个东西,这里的注释是指代码中的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。 通过这些标记,可以在不改变原有逻辑的情况下,在源文件嵌入一些补充的信息。Annotation可用于修饰包,类,构造器, 方法,成员变量,参数,局部变量的声明。
其实Java中的Annotation和C#中的attribute是同一个东西,都是用来设置元数据用的,它们的区别只有少许几个地方
下面这个帖子讲的很好
http://rednaxelafx.iteye.com/blog/464889
Java中有3种内建的annotation,@Override(限定重写父类方法)、@Deprecated(标示已过时)、@SuppressWarningsAnnotation(抑制编译器警告)
自定义的annotation如以下格式,需要使用@interface关键字,要使用annotation需引用java.lang包
下面看一个使用annotation的例子
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
//定义一个标记注释,不包含任何成员变量,即不可传入元数据
public @interface Testable
{
}
public class MyTest
{
//使用@Testable标记注释指定该方法是可测试的
@Testable
public static void m1()
{
}
public static void m2()
{
}
//使用@Testable标记注释指定该方法是可测试的
@Testable
public static void m3()
{
throw new RuntimeException("Boom");
}
public static void m4()
{
}
//使用@Testable标记注释指定该方法是可测试的
@Testable
public static void m5()
{
}
public static void m6()
{
}
//使用@Testable标记注释指定该方法是可测试的
@Testable
public static void m7()
{
throw new RuntimeException("Crash");
}
public static void m8()
{
}
}
import java.lang.reflect.*;
public class TestProcessor
{
public static void process(String clazz)
throws ClassNotFoundException
{
int passed = 0;
int failed = 0;
//遍历obj对象的所有方法
for (Method m : Class.forName(clazz).getMethods())
{
//如果包含@Testable标记注释
if (m.isAnnotationPresent(Testable.class))
{
try
{
//调用m方法
m.invoke(null);
//passed加1
passed++;
}
catch (Exception ex)
{
System.out.printf("方法" + m + "运行失败,异常:" + ex.getCause() + "\n");
failed++;
}
}
}
//统计测试结果
System.out.printf("共运行了:" + (passed + failed)+ "个方法,其中:\n" +
"失败了:" + failed + "个,\n" +
"成功了:" + passed + "个!\n");
}
}
主程序类
import java.lang.reflect.*;
public class RunTests
{
public static void main(String[] args) throws Exception
{
//处理MyTest类
TestProcessor.process("MyTest");
}
}
其中m3和m7两个方法自己抛出异常,剩下两个空方法执行成功