17---java中Annotation深入04

本文深入探讨Java中的注解使用方式,包括@Target限定注解作用范围、@Documented影响Javadoc生成、@Inherited实现注解继承等特性,并通过实例演示如何在实际项目中运用这些注解。
 

之前定义的Annotation,如果没有明确说明使用位置,则可以再任何位置使用;
1、@Target(value=ElementType.Type)----只能用在类上;
 import java.lang.annotation.Target;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;

 //此注释表示下面的@MyTargetAnnotation注释只能用在类上
 @Target({ElementType.TYPE,ElementType.METHOD})
 @Retention(value=RetentionPolicy.RUNTIME)
 public @interface MyTargetAnnotation{
  public String key() default "lid";
  public String value() default "yuj";
  }

 @MyTargetAnnotation(key="yuj",value="lid")
 public class SimpleBean{
  @Override
  @MyTargetAnnotation(key="yuj",value="lid")
  public String toString(){
   return null;
   }
 }

2、@Documented可以用在任何的Annotation上使用,所有的Annotation默认情况下都是用
 @Documented进行注释的,而且在生成javadoc的时候可以通过@Documented设置一些
 说明。
 
  import java.lang.annotation.Target;
  import java.lang.annotation.ElementType;
  import java.lang.annotation.Retention;
  import java.lang.annotation.RetentionPolicy;

  //此注释表示下面的@MyTargetAnnotation注释只能用在类上
  @Target({ElementType.TYPE,ElementType.METHOD})
  @Retention(value=RetentionPolicy.RUNTIME)
  public @interface MyTargetAnnotation{
   public String key() default "lid";
   public String value() default "yuj";
   }

  @MyTargetAnnotation(key="yuj",value="lid")
  public class SimpleBean{
   /**
    *此方法在对象输出时调用,返回对象信息
    */
   @MyTargetAnnotation(key="yuj",value="lid")
   public String toString(){
    return null;
    }
  }
  之后通过javadoc命令,生成java doc文档;
  命令:javadoc -d doc SimpleBean.java
  这样上面的关于方法的注释会在生成文档时加入到文档中;
  

3、Inherited:
 定义一个可以被继承的Annotation
  package com.demo.lid;
  import java.lang.annotation.Inherited;
  import java.lang.annotation.Retention;
  import java.lang.annotation.RetentionPolicy;
  import java.lang.annotation.Documented;

  @Retention(value=RetentionPolicy.RUNTIME)
  @Inherited
  @Documented
  public @interface MyInherited{
   public String name();
   }

 定义一个父类:
  package com.demo.lid;
  @MyInherited(name="lid")
  public class Person{
   
  }
 定义一个子类:
  package com.demo.lid;
  public class Student extends Person{
   }
 使用Inherited声明的Annotation是可以被子类继承下来的;
 通过反射来验证时候子类继承了父类的Annotation
  package com.demo.lid;
  import java.lang.annotation.Annotation;
  public class ReflectInheritedDemo{
   public static void main(String args[]) throws Exception{
    Class<?> c=Class.forName("com.demo.lid.Student");
    Annotation ann[]=c.getAnnotations();
    for(Annotation a : ann){
      System.out.println(a);
     }
    //继续取得此Annotation设置的内容
    if(c.isAnnotationPresent(MyInherited.class)){
     //上面指的是c元素上存在MyInherited注释
     MyInherited mda=null;
     mda=c.getAnnotation(MyInherited.class);
     String name=mda.name();//取得name属性
     System.out.println("name="+name);
     }
    }
   }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bzuld

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值