day26_Annotation

本文深入讲解Java注解技术,包括自定义注解的定义及使用方法,反射获取注解信息,以及JDK内置注解的应用。并通过实例演示如何利用注解进行代码运行控制。

一、概述

Annotation 其实就是代码里的特殊标记, 它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行。在Java技术里注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。


 掌握注解技术的要点:
如何定义注解
如何反射注解,并根据反射的注解信息,决定如何去运行类


二、自定义注解的语法


注解本身:public @interface MyAnnotation{}
使用关键字@interface定义一个类而已。这个类就是注解。
注解中的属性:
基本形式:类型 属性名称();
比如:String name();
使用:@MyAnnotationDemo1(name="hello")
特别注意:注解的属性的类型只能是:基本类型、String、Class、枚举、注解类型及以上类型的一维数组。


注解属性的默认值
类型 属性名称() default 默认值;


注解中的特殊属性
类型 value();   使用时,如果只给value设置值,可以这样用:@MyAnnotationDemo1(value="hello")或者@MyAnnotationDemo1("hello")
 使用时,如果只给value设置值,还要给其他属性设置值,可以这样用:
@MyAnnotationDemo1(value="hello",name="aaa")
类型[] value();
使用方式如同value。
使用方式:四种都ok
// @MyAnnotationDemo1(value={"a","b"})
// @MyAnnotationDemo1({"a","b"})
// @MyAnnotationDemo1({"a"})
@MyAnnotationDemo1("a")

JDK中提供的三个基本的注解
   @Override:说明是否覆盖了父类的方法。
       @Deprecated:说明过时了。
            @SuppressWarnings:抑制警告
                @SuppressWarnings("抑制的警告的具体类型"):
                          unused:变量未使用
                          deprecation:使用了不赞成使用的类或方法时的警告
                           unchecked:执行了未检查的转换时的警告。比如没有使用泛型
                           falthrough:当switch程序块直接通往下一种情况而没有break时的警告
                           path:在类路径、源文件路径等中有不存在的路径时的警告。
                           serial:当在可序列化雷尚缺少serialVersionUID定义时的警告
                          finally:任何finally子句不能正常完成时的警告。
                          all:关于以上所有情况的警告。

元注解:

定义:服务于注解的注解就是元注解。
**          *@Retention:注解的保留范围
RetentionPolicy.SOURCE:注解存在于源文件中
RetentionPolicy.CLASS:注解存在于源字节码文件中
RetentionPolicy.RUNTIME:注解存在于运行时
**          *@Target:注解出现的位置
               @Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.
               @Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解


三、注解的使用

mytest实现
public class DemoTest1 {
	
	@MyTest(time=1)
	public void test1(){
		for(int i=0;i<100;i++)
			System.out.println("test1执行了");
	}
	
	@MyTest()
	public void test2(){
		System.out.println("test2执行了");
	}

}
注解的定义
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.FIELD})
public @interface MyTest {
	long time() default Long.MAX_VALUE ;
}

核心运行类
public class MyJunitRunner {
	public static void main(String[] args) throws Exception
	{
		DemoTest1 test1 = new DemoTest1();
		Method[] mds = DemoTest1.class.getMethods();
		for(Method m : mds)
		{
			System.out.println(m.getName());
			
			if(m.isAnnotationPresent(MyTest.class))
			{
				long time = m.getAnnotation(MyTest.class).time();
				long timeNow = System.currentTimeMillis();
				m.invoke(test1, null);
				long factTime = System.currentTimeMillis()-timeNow;
				
				System.out.println(factTime);
				if(factTime>time){//超出了指定时间
					throw new RuntimeException("超时");
				}
				
			}
		}
	}
	
	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值