10_2、Java基本语法之注解(Annotation)的使用

一、注解的理解

        1、jdk5.0新增
        2、在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。

        3、Annotation 其实就是代码里的特殊标记, 这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用 Annotation, 程序员可以在不改变原逻辑的情况下, 在源文件中嵌入一些补充信息。

二、注解的使用示例

        示例1:生成文档相关的注解

/**
	 * 
	* @Description 返回当前团队的所有对象
	* @author suxintai
	* @date 2022年11月14日下午7:38:19
	* @return 包含所有成员对象的数组,数组大小与成员人数一致
	 */
	public Programmer[] getTeam(){
		Programmer[] team = new Programmer[total];
		for(int i=0;i<team.length;i++){
			team[i] = this.team[i];
		}
		return team;
	}

	/**
	 * 
	* @Description 从团队中删除成员
	* @author suxintai
	* @date 2022年11月14日下午7:40:04
	* @param memberId
	 * @throws TeamException 
	 */
	public void removeMember(int memberId) throws TeamException{
		int i = 0;
		for(;i<total;i++){
			if(team[i].getMemberId() == memberId){
				team[i].setStatus(Status.FREE);
				break;
			}
		}
		
		if(i>=total){
			throw new TeamException("找不到该成员,无法删除");
		}
		
		for(int j = i;j<total-1;j++){
			team[j] = team[j+1];
		}
//		team[total-1] = null;
//		total--;
		team[--total] = null;
	}


        示例2:在编译时进行格式检查(JDK内置的个基本注解)
                @Override: 限定重写父类方法, 该注解只能用于方法

class Student extends Person{
    @Override
    public void wolk() {
        System.out.println("学生走路");
    }
}


                @Deprecated: 用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择


                @SuppressWarnings: 抑制编译器警告
        示例3:跟踪代码依赖性,实现替代配置文件功能,比如:Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署。

 

三、如何自定义注解:仿照@SuppressWarnings

        说明:
                1.声明为@interface
                2.内部定义成员,通常使用value表示
                3.可以指定成员的默认值,使用default来定义
                4.如果自定义注释没成员,表明是一个标识作用

        如果注解成员,在使用注解时,必须指明注解的成员的值,自定义注解必须配上注解的信息处理流程(使用反射才有意义)。

代码示例:

public @interface MyAnnotation {
    String value() default "hello";
}

四、元注解 :对现有的注解进行解释说明的注解。 

        JDK5.0提供了4个标准的meta-annotation类型,分别是:
                1、Retention: 用于指定该 Annotation 的生命周期(SOURCE、CLASS(默认行为)、RUNTIME,只有声明为RUNTIME生命周期的注解才可以通过反射来获取。
                2、Target:用于指定被修饰的 Annotation 能用于修饰哪些程序元素。
        以下两种元注解出现频率较低:
                3、Documented:用于指定被该元 Annotation修饰的Annotation类将被javadoc工具提取成文档。默认情况下,javadoc是不包括注解的。定义为Documented的注解必须设置Retention值为RUNTIME。
                4、Inherited: 被它修饰的Annotation将具继承性。如果某个类使用了被@Inherited修饰的Annotation, 则其子类将自动具该注解。

        类比:元数据的概念:String name = "Tom";

五、 如何获取注解信息

        通过反射获取注解信息(这段内容到后面反射机制中讲解)
        前提:只声明为RUNTIME生命周期的注解才可以通过反射来获取。

六、JDK8中注解的新特性

jdk8中新增了两种注解:可重复注解、类型注解
        1.可重复注解:①在MyAnnotation中声明@Repeatable(),参数为MyAnnotation1.class
                                 ②MyAnnotation中的Retention、Target等注解必须和MyAnnotation1保持一致。

        2.类型注解
             ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)。
             ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。

@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyAnnotation1.class)
@Inherited
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.TYPE,ElementType.TYPE_PARAMETER,ElementType.TYPE_USE})
@Documented
public @interface MyAnnotation {
    String value() default "hello";
}
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.TYPE})
public @interface MyAnnotation1 {
    MyAnnotation[] value();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值