定义一个metadata . Test.java
package maoxiang.examples.jdk15.metadata;
import java.lang.annotation.*;
/**
* Indicates that the annotated method is a test method.
* This annotation should be used only on parameterless static methods.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test { }
在别的类中使用metadata. Foo.java
package maoxiang.examples.jdk15.metadata;
/**
* @author 毛翔
*
*/
public class Foo {
public static void main(String[] args) {
}
@Test public static void m1() { }
public static void m2() { }
@Test public static void m3() {
throw new RuntimeException("Boom");
}
public static void m4() { }
@Test public static void m5() { }
public static void m6() { }
@Test public static void m7() {
throw new RuntimeException("Crash");
}
public static void m8() { }
}
利用metadata . RunTests.java
package maoxiang.examples.jdk15.metadata;
import java.lang.reflect.Method;
import maoxiang.examples.jdk15.metadata.Demo.Test;
/**
* @author 毛翔
*
*/
public class RunTests {
public static void main(String[] args) throws Exception {
int passed = 0, failed = 0;
for (Method m : Class.forName(args[0]).getMethods()) {
if (m.isAnnotationPresent(maoxiang.examples.jdk15.metadata.Test.class)) {
try {
m.invoke(null);
passed++;
} catch (Throwable ex) {
System.out.printf("Test %s failed: %s %n", m, ex.getCause());
failed++;
}
}
}
System.out.printf("Passed: %d, Failed %d%n", passed, failed);
}
}