JAVA注解使用方法

注解技术源于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());
}

你可能感兴趣的:(JAVA注解使用方法)