注解技术源于JDK5.0版本,注解是一种标记,可以出现在类定义前,方法定义前,成员变量定义前。
注解符号可以通过反射技术进行读取。
泛型和动态参数定义与注解同一时期产生。
声明一个注解Test
package mark1;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
*annotation注解
*@Target注释目标
*@Retention保留范围
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
//测试方法的属性
int id() default 0;
String value() default "";
}
声明一个类A使用注解
package mark1;
public class A {
@Test("第一个测试方法")
public void a()
{
System.out.println("A类a方法");
}
@Test(id=1,value="第二个测试方法")
public void b()
{
System.out.println("A类b方法");
}
@Test()
public void c()
{
System.out.println("A类c方法");
}
public void d()
{
System.out.println("A类d方法");
}
}
编写运行类Runner
package mark1;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Runner {
public static void run(Class<?> c) {
try {
Object obj = c.newInstance();
// 获得所有可见方法
Method[] a = c.getMethods();
for (Method m : a) {
Test test = m.getAnnotation(Test.class);
if (test != null) {
System.out.println("测试id:" + test.id());
System.out.println("测试名称value:" + test.value());
try {
m.invoke(obj);// 反射调用
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
System.out.println("调用失败");
}
}
}
} catch (InstantiationException | IllegalAccessException
| SecurityException e) {
System.out.println("运行失败");
}
}
}
编写测试类TestA
package mark1;
public class TestA {
public static void main(String[] args) {
Runner.run(A.class);
}
}
运行结果
测试id:0
测试名称value:
A类c方法
测试id:1
测试名称value:第二个测试方法
A类b方法
测试id:0
测试名称value:第一个测试方法
A类a方法
如果更改value的属性为name
那么赋值的时候就不能像
@Test("第一个测试方法")
这样直接为value赋值
而是应该
@Test(name="第一个测试方法")
public void a()
{
System.out.println("A类a方法");
}
@Test(id=1,name="第二个测试方法")
public void b()
{
System.out.println("A类b方法");
}
if (test != null) {
System.out.println("测试id:" + test.id());
System.out.println("测试名称name:" + test.name());
}