java 注解:SuppressWarnings、Deprecated、Override

本文深入探讨Java注解的概念、用途以及如何在代码中应用注解,包括使用示例和注解的基本步骤。

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

Annotation注解在Java中有着很广泛的,他是做为一种标识 为javac所识别,。每一个注解 都对应这一个Java类  在java.lang包中 有三个注解  分别是
Deprecated    SuppressWarning   Override    在使用 注解前必须要在 注解类前面加上@    每增加一个注解 就意味着产生了一个注解对象 。
注解就是一个标识,编译器 通过标识来输出不同的编译结果  。    
Deprecated   过时的
SuppressWarning    抑制警告
Override    覆盖
比如@Deprecated   过时API注解   我们在用到JDK提供的API的时候,在编译中遇到 这样的提示 提示用到过时的API ,那么这个API 就被这个@Deprecated注解所 标识,在javac进行编译的时候  发现了注解便做出相应的提示 。
@SuppressWarning("deprecation")  从字面意思上就是抑制 过时API的警告,这个可以放在调用过时的API的方法外部或者调用方法之前,那么在编译的时候javac遇到这个标识 即使知道API过时那么也不会输出过时API的提示   
@Override 这个是覆盖注解,也就是在继承中进行覆盖 父类的某个方法的时候可以加上这个注解,加上这个注解之后 如果我们的覆盖方法 出错了Eclipse会提示我们错误


下面是简单的应用:
package me.test;
public class AnnotationTest  extends Test
{  

@SuppressWarnings("deprecation")
public static void main(String []aegs)
{  

  System.runFinalizersOnExit(true)  ;
  sayHello();
  AnnotationTest t=new AnnotationTest() ;
  t.show() ;
}
@Deprecated     //Deprecated  Annotation
public  static  void sayHello()
{
  System.out.println("hello ,world!");
}

    @Override
public  void  show()
{
  System.out.println("super class");
}

}
public class Test {
@Deprecated
public  void  show()
{
  System.out.println("super class");
}
}

public class Test {
public  void  show()
{
  System.out.println("super class");
}
}

什么是注解(Annotation),我们先来看如下代码:public class AnnotationTest {
public static void main(String[] args) {
  Date nowDate = new Date();
  String strDate = nowDate.toLocaleString();
  System.out.println(strDate);// 2009-12-27 16:44:09}
上述代码在eclipse编辑器中会出现警告,内容为"The method toLocaleString() from the type Date is deprecated",它的意思是说toLocaleString()方法是个过时的方法;
为了更好的理解它的含义,我们在cmd窗口来编译它,如下

java 注解:SuppressWarnings、Deprecated、Override

那么我们可以怎么把这个警告给去掉呢,这是就要使用到注解,我们在main方法之前加上这样一句"@SuppressWarnings("deprecation")",也可以用快捷方式加上,那么警告就会消失。public class AnnotationTest {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
  Date nowDate = new Date();
  String strDate = nowDate.toLocaleString();
  System.out.println(strDate);// 2009-12-27 16:44:09}

注意:每个注解就是一个类,我们在用注解时,就相当于创建了一个注解类的实例;

2.在写程序中,我们可能不希望某个方法之后不被再次调用,那么我们就可以把这个方法定义为过时的方法,过时的方法在调用时,会在方法名上打上删除线,告诉程序员该方法为过时方法,最后不要再用了。下面我们写一个自定义的过时方法:public class AnnotationTest {

@Deprecated
private static void sayHello() {
  System.out.println("Hello word !");public static void main(String[] args) {
  AnnotationTest.sayHello();}

注意:只需要在方法前加上:@Deprecated,那么该方法就会被eclipse编辑器打上删除线,来表明为过时方法.

3.JDK为我们提供了如下3中基本的注解Annotation:
.Deprecated:用@Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。 
.Override:用@Override表示一个方法声明打算重写超类中的另一个方法声明。 
.SuppressWarnings:@SuppressWarnings("deprecation")指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。

4.注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,java编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事,标记可以加在包,类,字段,方法,方法的参数以及局部变量上。它位于java.lang.annotation中。

5.通常应用注解有如下三个步骤:
1).定义注解类,格式为:public @interface A{2).应用注解类,如:
@A
class B{3).对应用注解类的类进行反射操作(的类),如:
B.class.isAnnotationPresent(A.class);
A a = B.class.isAnnotationPresent(A.class);

6.下面我们来完成上述三步操作:
1).切换到java透视图上,点击新建一个注解:public @interface MyAnnotation {2).创建一个类应用该注解:
@MyAnnotation
public class AnnotationTest {
public static void main(String[] args) {}
3.对应用注解类的类进行反射操作:
public static void main(String[] args) {
  if (AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) {
  MyAnnotation myAnnotation = AnnotationTest.class.getAnnotation(MyAnnotation.class);
  System.out.println(myAnnotation);}
注:这是程序运行没有输出,明明有注解,怎么会没输出呢?这时我们在MyAnnotation注解类前面加上:@Retention(RetentionPolicy.RUNTIME),再次运行时,就会输出"MyAnnotation"

7.下面我们来解释下什么叫Retention,Retention本身也是一个注解,叫元注解,它后面跟一个值,这个值表示该注解保留到代码的那个阶段;
@Retention元注解,有三种取值,即有三种生命周期:
RetentionPolicy.SOURCE:对应java源文件(如:@override、@superwarnings)
RetentionPolicy.CLASS:对应class文件
RetentionPolicy.RUNTIME:对应内存中的字节码(如:@Deprecated)
默然值就是RetentionPolicy.CLASS,在注解类上加的注解叫“元注解”,class文件本身不是字节码,只有class文件被类加载器被加载到内存中进行校检处理之后,才是二进制的字节码,他们的生命周期不是不同的。
注:如果我们把6中的RetentionPolicy.RUNTIME,改成其他两个中任何一个得话,也是无输出的,因外其他两个的注解生命周期不是运行期,即在内存中无法找到。

8.如果我们在MyAnnotation注解类前面再加上:@Target(ElementType.METHOD),那么AnnotationTest类前面就会有错误提示:"The annotation @MyAnnotation is disallowed for this location",即@MyAnnotation不能放在这个位置,为什么呢?因为刚才我们在MyAnnotation注解类前面再加上:@Target(ElementType.METHOD),它表示该注解只能用在方法上面,如果要想让该注解用的类上面,就可以不刚才那句修改成"@Target({ElementType.METHOD,ElementType.TYPE})",ElementType.TYPE它表示该注解可以应用的类,接口,枚举等类型上。

9.注解的高级应用-为注解增加属性,我们在刚才的MyAnnotation注解类增加一个属性,代码如下:@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
String color();那么此时,我们就会发现,AnnotationTest类的上面有错误提示“The annotation @MyAnnotation must define the attribute color”,即必定义color的属性,我们此时就可以把类上面的注解修改成:@MyAnnotation(color="red"),OK了!说明注解类有属性时,在我们调用时就必须提供属性值,除非注解类中的属性有默认值,@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
String color() default "yellow";调用的时候就可以直接:@MyAnnotation或@MyAnnotation();

再如代码:
public @interface MyAnnotation {
String color() default "yellow";
String style();调用的时候就可以直接: @MyAnnotation(color="red",style="fashion")或@MyAnnotation(style="fashion");有默认值的时候,默认值可以省略。

但是通常我们有如下用法:
@SuppressWarnings("deprecation"),它怎么只提供属性值,而没有属性名呢?这就是value()属性的特殊用法,它可以放回任意类型;

再如代码:
public @interface MyAnnotation {
String color() default "yellow";
String style() default "fashion";
String value();调用的时候就可以直接: @MyAnnotation(color="red",style="fashion",value="hello")
或@MyAnnotation("hello");

10.为注解增加高级属性,如数组,枚举,注解,具体就不再举例了,可以参考java语言规范中的实例。

J2SE 提供的最后一个批注是 @SuppressWarnings。该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默。 一点背景:J2SE 5.0 为 Java 语言增加了几个新的特性,并且和它们一起增加了许多新的警告并承诺在将来增加更多的警告。您可以为 "javac" 增加 -Xlint 参数来控制是否报告这些警告(如上面的 @Deprecated 部分所示)。 默认情况下,Sun 编译器以简单的两行的形式输出警告。通过添加 -Xlint:keyword 标记(例如 -Xlint:finally),您可以获得关键字类型错误的完整说明。通过在关键字前面添加一个破折号,写为 -Xlint:-keyword,您可以取消警告。(-Xlint 支持的关键字的完整列表可以在 javac 文档页面上找到。)下面是一个清单: 关键字 用途 deprecation 使用了不赞成使用的类或方法时的警告 unchecked 执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型。 fallthrough 当 Switch 程序块直接通往下一种情况而没有 Break 时的警告。 path 在类路径、源文件路径等中有不存在的路径时的警告。 serial 当在可序列化的类上缺少 serialVersionUID 定义时的警告。 finally 任何 finally 子句不能正常完成时的警告。 all 关于以上所有情况的警告。 @SuppressWarnings 批注允许您选择性地取消特定代码段(即,类或方法)中的警告。其中的想法是当您看到警告时,您将调查它,如果您确定它不是问题,您就可以添加一个 @SuppressWarnings 批注,以使您不会再看到警告。虽然它听起来似乎会屏蔽潜在的错误,但实际上它将提高代码安全性,因为它将防止您对警告无动于衷 — 您看到的每一个警告都将值得注意。 下面是使用 @SuppressWarnings 来取消 deprecation 警告的一个例子: public class DeprecatedExample2 { @Deprecated public static void foo() { }}public class DeprecatedUser2 { @SuppressWarnings(value={"deprecation"})public static void main(String[] args) { DeprecatedExample2.foo(); }} @SuppressWarnings 批注接收一个 "value" 变量,该变量是一个字符串数组,它指示将取消的警告。合法字符串的集合随编译器而变化,但在 JDK 上,可以传递给 -Xlint 的是相同的关键字集合(非常方便)。并且要求编译器忽略任何它们不能识别的关键字,这在您使用一些不同的编译器时非常方便。 因为 @SuppressWarnings 批注仅接收一个参数,并为该参数使用了特殊的名称 "value",所以您可以选择省略 value=,作为一种方便的缩写: public class DeprecatedUser2 { @SuppressWarnings({"deprecation"})public static void main(String[] args) { DeprecatedExample2.foo(); }} 您可以将单个数组参数中的任意数量的字符串值传递给批注,并在任何级别上放置批注。例如,以下示例代码指示将取消整个类的 deprecation 警告,而仅在 main() 方法代码内取消 unchecked 和 fallthrough 警告: import java.util.*;@SuppressWarnings({"deprecation"})public class NonGenerics { @SuppressWarnings({"unchecked","fallthrough"})public static void main(String[] args) { Runtime.runFinalizersOnExit(); List list = new ArrayList(); list.add("foo"); } public static void foo() { List list = new ArrayList(); list.add("foo"); }} @SuppressWarnings 是否比前两个批注更有用?绝对是这样。不过,在 JDK 1.5.0 版本中还没有完全支持该批注,如果您用 1.5.0 来尝试它,那么它将类似无操作指令。调用 -Xlint:-deprecation 也没有任何效果。Sun 没有声明什么时候将增加支持,但它暗示这将在即将推出的一个 dot 版本中实现。 更进一步 如果您试图在 Javadocs 页面中查看这些属性,那么您可能很难找到它们。它们位于核心的 java.lang 包中,但有点隐蔽,它们出现在 Javadoc 类的最底端,列在 Exceptions 和 Errors 后面。 注意到了附加在 SuppressWarnings 批注后面的陌生的批注 @Target 和 @Retention 了吗?这些称为元数据批注,它们描述了该批注在哪里适用。我将在本系列的第二篇文章中介绍它们,以及介绍如何将元数据批注应用到您自己的批注中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值