java Annotation简介

本文深入介绍了Java中的注解概念,包括标准注解如@ Override、@Deprecated和@ SuppressWarnings 的用途,以及如何自定义注解并应用到类、方法等元素上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

annotation是与一个程序元素相关联信息或者元数据的标注。它从不影响java程序的执行,但是对例如编译器警告或者像文档生成器等辅助工具产生影响。

java5.0在java.lang包中定义了3种标准的annotation类型:

1、Override 是一个marker annotation类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation在一个 没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时发挥威力。

@Override

public void toString();

 

2、Deprecated: 是一个marker annotation。当一个类型或者类型成员使用@Deprecated修饰的话,编译器将不鼓励使用这个被标注的程序元素。而且这种修饰具有一定的 “延续性”:如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为Deprecated,但编译器仍然要报警。  

 

3、 SuppressWarnings:
@SuppressWarnings 被用于有选择的关闭编译器对类、方法、成员变量、变量初始化的警告。
annotation语法允许在annotation名后跟括号,括号中是使用逗号分割的name=value对用于为annotation的成员赋值:

    @SuppressWarnings(value={"unchecked","fallthrough"})

    @SuppressWarnings("unchecked")

 

 

自定义Annotation

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation
{
 String value();
}

// @interface 关键字,表示该类为Annotation定义

 

/*

@Target里面的ElementType是用来指定Annotation类型可以用在哪些元素上的.例如:
  TYPE(类型)、FIELD(属性)、METHOD(方法)、PARAMETER(参数)、CONSTRUCTOR(构造函数)、LOCAL_VARIABLE(局部变量),、
  PACKAGE(包),其中的TYPE(类型)是指可以用在Class,Interface,Enum和Annotation类型上。
  
@RetentionPolicy 共有三种策略,分别为:
SOURCE:这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面
CLASS:这个Annotation类型的信息保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这些信息加载到JVM中。注:默认策略为CLASS类型
RUNTIME:表示在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的

@Documented 目的就是将这一Annotation的信息显示在JAVA API文档上,

 

 

 

String value();
   表示有一个成员参数,名字为value,访问权为默认(default)修饰符,注意以下两点:
访问权只能用public和默认(default)修饰
参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String,Enum,Class,annotations等数据类型,以及这一些类型的数组

*/

 

 

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotationTwo
{
 String description();
 boolean isOk();
}

 

 

编写测试函数:

 

@MyAnnotation("This is my Annotation")
public class MyAnnotationTest
{
 @MyAnnotationTwo(description = "annotationTwo", isOk = true)
 public void sayHello()
 {
  System.out.println("hello world!");
 }

 @Test//使用了JUnit
 public void test() throws ClassNotFoundException, SecurityException, NoSuchMethodException
 {
  Class<?> cls = Class.forName("MyAnnotationTest");
  boolean flag = cls.isAnnotationPresent(MyAnnotation.class);// 判断该类是否使用了MyAnnotation1的注释  
  if(flag)
  {
   System.out.println("判断类是annotation");   

   MyAnnotation annotation1 = cls.getAnnotation(MyAnnotation.class);
   System.out.println(annotation1.value());
  }

  Method method = cls.getMethod("sayHello");
  flag = method.isAnnotationPresent(MyAnnotationTwo.class);//  判断该方法是否使用了MyAnnotation2的注释
  if(flag)
  {
   System.out.println("判断方法也是annotation");
   MyAnnotationTwo annotation2 = method.getAnnotation(MyAnnotationTwo.class);
   System.out.println(annotation2.description() + "\t" + annotation2.isOk());
  }
 }
}

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值