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());
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,600评论 1 92
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,974评论 6 342
  • 03联机学习 1/2 如何提高认知效率?找到知识源头、极其功力的读书、萃取知识晶体。 找到知识源头 所谓找到知识的...
    哇620阅读 231评论 0 2
  • 转自我的博客:Qiuncheng‘s Blog 对于iOS新手来说,其中最困难也是最麻烦的就包括AutoLayou...
    VSCCW阅读 1,583评论 4 9