当前位置:   article > 正文

详述自定义注解_注解中value有多个值

注解中value有多个值

一、认识注解

  • JDK5及其以后JDK版本开始支持Java注解;
  • Java注解(Annotation)也叫作元数据,以‘@注解名’在代码中存在,它是一种在源代码中标注的特殊标记,可以标注源代码中的类、属性、方法、参数等代码,主要用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。

二、Java内置注解

  • @Override被用于标注方法,用于说明所标注的方法是重写父类的方法:

  • @Deprecated 用于说明所标注元素(成员变量或方法)因存在安全问题或有更好选择而不鼓励程序员使用,如果强行使用,则编译器会发出警告。

  • @SuppressWarnings用于取消编译器所显示的警告,该注解常用属性值如下: 

①deprecation:使用已被@Deprecated标注的程序元素;

②unused:程序含有未被使用的元素;

③serial:在可序列化的类上缺少serialVersionUID定义;

三、自定义注解

1、注解语法结构

  1. [public@interface 注解名 {
  2. [属性1;]
  3. [属性2;]
  4. ...
  5. [属性n;]
  6. }

2、自定义注解中属性的语法结构

数据类型 属性名() [default 默认属性值];

3、注解属性默认没有默认值,如果注解中定义了无默认值的注解属性,则使用该注解时必须指定值,不然就像下面的例子一样会报错。

4、如果注解属性名为value,使用该注解时可以直接赋值。如下图所示:

5、如果注解属性的数据类型为数组类型,赋多个值时必须使用{}括起来;但若只赋一个值,则无需使用{}:

 

四、元注解

     Java提供了四个用于修饰自定义注解的元注解:@Target、@Retention 、@Documented和@Inherited。

    1、@Target用于指定被修饰的自定义注解只能用于修饰程序中哪些元素,该元注解有如下属性值:

  • ElementType.FIELD:应用于全局属性
  • ElementType.METHOD:应用于方法
  • ElementType.PARAMETER:应用于方法的参数
  • ElementType.TYPE:应用于类、接口或者枚举声明

   2、@Retention:用于指定被修饰的自定义注解可以保留多久,该元注解有如下属性值:

  • RetentionPolicy.SOURCE:编译器将直接丢弃被修饰的注解
  • RetentionPolicy.CLASS:默认值,编译器将把注解记录在class文件中,当运行Java程序时,虚拟机不再保留注解;
  • RetentionPolicy.RUNTIME:编译器将把注解记录在class文件中,当运行java程序时,虚拟机保留注解,程序可以通过反射获取该注解;

   3、@Documented:执行javadoc命令时,被该元注解修饰的自定义注解也会生成在文档中,如下例:

eclipse中的操作如下:

  • 选中java工程鼠标右键点击“Export…”,出现下图:

  • 在上图红框处输入javadoc点击“Next >”按钮,出现下图:

  • 点击“Finish”按钮打开项目根目录打开名为doc的文件夹使用浏览器软件(如Google)打开名为index.html文件点击 “Student”导航,在右侧即可找到如下内容:

  • 说明:如果@Documented元注解没有修饰前面Override自定义注解,则生成的文档不会有如上图红框框起的部分。

4、@Inherited:如果父类所使用的注解有@Inherited修饰,则子类可以继承该注解,否则不能继承。

 

五、实例演示,通过以下例子来说明如何使用以上自定义注解和自定义注解的用处。

  • 自定义一个注解。
  1. package demo;
  2. import java.lang.annotation.Documented;
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Inherited;
  5. import java.lang.annotation.Retention;
  6. import java.lang.annotation.RetentionPolicy;
  7. import java.lang.annotation.Target;
  8. @Target(value=ElementType.METHOD) //此注解只能用于方法
  9. @Inherited //子类可以继承该注解
  10. @Retention(RetentionPolicy.RUNTIME) //此注解可以在运行java程序时通过反射获取到。
  11. public @interface Override {
  12. String[] value(); //未设置默认值,则在java文件中使用此注解时为value赋值,并且数组只有一个值时,“{}”可以省略。
  13. }
  • 创建Son类和Father类。
  1. package demo;
  2. import java.lang.annotation.Annotation;
  3. import java.lang.reflect.Method;
  4. public class Son extends Father{
  5. public static void main(String[] args) throws NoSuchMethodException, SecurityException {
  6. Class class1=Son.class;
  7. Method method=class1.getMethod("study");
  8. Annotation[] annotation=method.getAnnotations();
  9. for (Annotation annotation2 : annotation) {
  10. System.out.println(annotation2);
  11. }
  12. }
  13. }
  14. class Father {
  15. @Override(value = { "111" })
  16. public static void study() {
  17. }
  18. }
  • 输出结果如下

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/496059
推荐阅读
相关标签
  

闽ICP备14008679号