Java注释@interface的用法

Java注释@interface的用法java用@interfaceAnnotation{} 定义一个注解@Annotation,一个注解是一个类@Override,@Deprecated,@SuppressWarni

大家好,又见面了,我是你们的朋友全栈君。

java用  @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类

@Override,@Deprecated,@SuppressWarnings为常见的3个注解。
注解相当于一种标记,在程序中加上了注解就等于为程序加上了某种标记,以后,
JAVAC编译器,开发工具和其他程序可以用反射来了解你的类以及各种元素上有无任何标记,看你有什么标记,就去干相应的事

 

注解@Override用在方法上,当我们想重写一个方法时,在方法上加@Override,当我们方法的名字出错时,编译器就会报错,如图:

<span role="heading" aria-level="2">Java注释@interface的用法
       注解@Deprecated,用来表示某个类的属性或方法已经过时,不想别人再用时,在属性和方法
上用@Deprecated修饰,如图:

<span role="heading" aria-level="2">Java注释@interface的用法

  注解@SuppressWarnings用来压制程序中出来的警告,比如在没有用泛型或是方法已经过时的时候,
 如图:

  <span role="heading" aria-level="2">Java注释@interface的用法

注解@Retention可以用来修饰注解,是注解的注解,称为元注解

Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,
这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。RetentionPolicy有3个值:CLASS  RUNTIME   SOURCE
用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,
所以他们可以用反射的方式读取。RetentionPolicy.RUNTIME 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用.

package com.self;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
  
@Retention(RetentionPolicy.RUNTIME)  
public @interface MyTarget  
{ } 

定义个一注解@MyTarget,用RetentionPolicy.RUNTIME修饰;

package com.self;  
import java.lang.reflect.Method;  
public class MyTargetTest  
{  
 @MyTarget  
 public void doSomething()  
 {  
  System.out.println("hello world");  
 }  
   
 public static void main(String[] args) throws Exception  
 {  
  Method method = MyTargetTest.class.getMethod("doSomething",null);  
  if(method.isAnnotationPresent(MyTarget.class))//如果doSomething方法上存在注解@MyTarget,则为true  
  {  
   System.out.println(method.getAnnotation(MyTarget.class));  
  }  
  }  
}  

上面程序打印:@com.self.MyTarget(),如果RetentionPolicy值不为RUNTIME,则不打印

@Retention(RetentionPolicy.SOURCE )  
public @interface Override  
  
@Retention(RetentionPolicy.SOURCE )  
public @interface SuppressWarnings  
  
@Retention(RetentionPolicy.RUNTIME )  
public @interface Deprecated  

由上可以看出,只有注解@Deprecated在运行时可以被JVM读取到  

注解中可以定义属性,看例子:

@Retention(RetentionPolicy.RUNTIME)  
public @interface MyAnnotation  
{  
 String hello() default "gege";  
  String world();  
  int[] array() default { 2, 4, 5, 6 };  
  EnumTest.TrafficLamp lamp() ;  
  TestAnnotation lannotation() default @TestAnnotation(value = "ddd");  
  Class style() default String.class;  
}  

上面程序中,定义一个注解@MyAnnotation,定义了6个属性,他们的名字为:  

hello,world,array,lamp,lannotation,style.  

  • 属性hello类型为String,默认值为gege  
  • 属性world类型为String,没有默认值  
  • 属性array类型为数组,默认值为2,4,5,6  
  • 属性lamp类型为一个枚举,没有默认值  
  • 属性lannotation类型为注解,默认值为@TestAnnotation,注解里的属性是注解  
  • 属性style类型为Class,默认值为String类型的Class类型  

看下面例子:定义了一个MyTest类,用注解@MyAnnotation修饰,注解@MyAnnotation定义的属性都赋了值

@MyAnnotation(hello = "beijing", world="shanghai",array={},lamp=TrafficLamp.RED,style=int.class)  
public class MyTest  
{  
 @MyAnnotation(lannotation=@TestAnnotation(value="baby"), world = "shanghai",array={1,2,3},lamp=TrafficLamp.YELLOW)  
 @Deprecated  
 @SuppressWarnings("")  
 public void output()  
 {  
  System.out.println("output something!");  
 }  
}  

接着通过反射读取注解的信息:  

public class MyReflection  
{  
 public static void main(String[] args) throws Exception  
 {  
  MyTest myTest = new MyTest();  
    Class<MyTest> c = MyTest.class;  
    Method method = c.getMethod("output", new Class[] {});  
       //如果MyTest类名上有注解@MyAnnotation修饰,则为true  
  if(MyTest.class.isAnnotationPresent(MyAnnotation.class))  
  {  
   System.out.println("have annotation");  
  }  
   if (method.isAnnotationPresent(MyAnnotation.class))  
   {  
   method.invoke(myTest, null); //调用output方法  
   //获取方法上注解@MyAnnotation的信息  
     MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);  
    String hello = myAnnotation.hello();  
   String world = myAnnotation.world();  
   System.out.println(hello + ", " + world);//打印属性hello和world的值  
   System.out.println(myAnnotation.array().length);//打印属性array数组的长度  
   System.out.println(myAnnotation.lannotation().value()); //打印属性lannotation的值  
   System.out.println(myAnnotation.style());  
   }  
    //得到output方法上的所有注解,当然是被RetentionPolicy.RUNTIME修饰的  
     Annotation[] annotations = method.getAnnotations();  
      for (Annotation annotation : annotations)  
  {  
   System.out.println(annotation.annotationType().getName());  
  }  
   }  
}  

上面程序打印:  

have annotation  
output something!  
gege, shanghai  
3  
baby  
class java.lang.String  
com.heima.annotation.MyAnnotation  
java.lang.Deprecated 

如果注解中有一个属性名字叫value,则在应用时可以省略属性名字不写。  

可见,@Retention(RetentionPolicy.RUNTIME )注解中,RetentionPolicy.RUNTIME是注解属性值,属性名字是value,  

属性的返回类型是RetentionPolicy,如下:

public @interface MyTarget  
{  
    String value();  
}  

可以这样用:  

@MyTarget("aaa")  
 public void doSomething()  
 {  
  System.out.println("hello world");  
 }  

注解@Target也是用来修饰注解的元注解,它有一个属性ElementType也是枚举类型,  

值为:ANNOTATION_TYPE CONSTRUCTOR  FIELD LOCAL_VARIABLE METHOD PACKAGE PARAMETER TYPE  

@Target(ElementType.METHOD) 修饰的注解表示该注解只能用来修饰在方法上

@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.RUNTIME)  
public @interface MyTarget  
{  
 String value() default "hahaha";  
}  

如把@MyTarget修饰在类上,则程序报错,如:

@MyTarget  
public class MyTargetTest 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154415.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月4日 下午1:00
下一篇 2022年7月4日 下午1:00


相关推荐

  • 终端里跑图形应用「GitHub 热点速览」

    终端里跑图形应用「GitHub 热点速览」

    2026年3月15日
    2
  • 【OpenCV】SIFT原理与源码分析

    【OpenCV】SIFT原理与源码分析SIFT简介ScaleInvariantFeatureTransform,尺度不变特征变换匹配算法,是由DavidG.Lowe在1999年(《ObjectRecognitionfromLocalScale-InvariantFeatures》)提出的高效区域检测算法,在2004年(《DistinctiveImageFeaturesfromScale-Inva

    2022年6月21日
    61
  • 国产第一编程大模型GLM4.7在claude code和trae里面效果天差地别

    国产第一编程大模型GLM4.7在claude code和trae里面效果天差地别

    2026年3月12日
    3
  • String 数组转字符串形式

    String 数组转字符串形式使用 StringUtils 中的 join 函数 org apache commons lang StringUtils 示例 StringUtils join null nbsp nbsp nbsp nbsp nbsp nullStringUt join nbsp nbsp nbsp nbsp nbsp nbsp nbsp StringUtils join null nbsp nbsp nbsp nbsp nbsp StringUtils join

    2026年3月19日
    2
  • 漏洞扫描工具汇总「建议收藏」

    漏洞扫描工具汇总「建议收藏」漏洞扫描器可以快速帮助我们发现漏洞,如SQL注入漏洞、CSRF、缓冲区溢出等。下面就介绍几种常用的漏洞扫描工具。Fortify代码审计工具FortifySCA(FortifyStaticCodeAnalyzer),一款软件代码安全测试工具,提供静态源码扫描能力,包含了五大引擎分析系统:语义、结构、数据流、控制流、配置流。分析的过程中与特有的软件安全漏洞规则集进行全面的匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并生成报告。BurpSuiteAWVSAppScanDependen

    2025年11月7日
    8
  • 并行计算:MPI总结

    并行计算:MPI总结一 MPI 简介 1 什么是 MPIMassagePa 是消息传递函数库的标准规范 由 MPI 论坛开发 一种新的库描述 不是一种语言 共有上百个函数调用接口 提供与 C 和 Fortran 语言的绑定 MPI 是一种标准或规范的代表 而不是特指某一个对它的具体实现 MPI 是一种消息传递编程模型 并成为这种编程模型的代表和事实上的标准 2 MPI 的特点 MPI 有以下的特点 消息传递式并行程序设计指用户必须通过显式地发送和接收消息来实现处理机间的数据交换 在这种并行编程中 每个

    2026年3月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号