java注解annotation模拟Junit

1、注解的定义
1)使用 @interface 定义一个注解;元注解@Rentention @Target声明当前注解作用域以及目标对象,如果没有声明,在运行期间是无法获取到注解的信息。
2)在注解中定义一个属性,使用 default设置默认值。例如:public long timeout() default -1;
 

ElementType 部分属性:

 /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Parameter declaration */
    PARAMETER,


场景自定义一个注解带有name属性,创建一个Dao类,上面的方法使用自定义注解,带有@MyTest,并且name为yes的方法执行。

自定义注解MyTest:

//定义注解的时候,需要通过元注解Target说明当前的自定义注解的目标对象
@Target(ElementType.METHOD)
//定义注解的时候,需要通过元注解Retention说明当前自定义注解的作用域(Class,Source,Runtime)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
	//定义一个name属性,默认值为yes
	public String name() default "yes";
	
}

Dao类:

public class TestDao {
	
	@MyTest(name="yes")
	public void save1(){
		System.out.println("save1()执行。。。。");
	}
	
	@MyTest(name="no")
	public void save2(){
		System.out.println("save2()执行。。。。");
	}
	
	@MyTest
	public void save3(){
		System.out.println("save3()执行。。。。");
	}

}

注解解析类:

public class AnnotationTest {

	public static void main(String[] args) {

		Class clazz = TestDao.class;
		
		//获取TestDao的所有public方法,包括继承得到,默认继承Object
		Method[] methods = clazz.getMethods();
		
		//获取TestDao本类中的所有方法,不包括继承得到的。
		Method[] declaredMethods = clazz.getDeclaredMethods();
		
		for (Method method : declaredMethods) {
			
			//当前对象是否有指定的注解
			boolean has = method.isAnnotationPresent(MyTest.class);
			if (has) {
				try {
					//获取当前对象指定的注解
					MyTest mytest = method.getAnnotation(MyTest.class);
					
					//获取注解上 name 属性的值
					String name = mytest.name();
					
					//如果方法上有 @MyTest(name="yes")则执行
					if ("yes".equals(name)) {
						method.invoke(clazz.newInstance());
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

结果:save1()方法上有@MyTest(name="yes"),所以执行。
           save3()方法上有@MyTest,没有指定name,default值为 yes,所以执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值