`

JAVA 注解:SuppressWarnings、Deprecated、Override

    博客分类:
  • Java
阅读更多
为了是大家初步了解什么是注解(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窗口来编译它,如下





那么我们可以怎么把这个警告给去掉呢,这是就要使用到注解,我们在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语言规范中的实例。
  • 大小: 4.6 KB
分享到:
评论

相关推荐

    java中注解的使用与实例

     @Deprecated,使用了注解为它的元素编译器将发出警告,因为注解@Deprecated是不赞成使用的代码,被弃用的代码。  @SuppressWarnings,关闭不当编译器警告信息。  上面这三个注解多少我们都会在写代码的时候...

    JavaSE-注解与反射(框架底层实现机制)

    @Override:重写方法 @Deprecated:废弃 @SuppressWarnings:镇压警告 元注解(meta-annotation): 可自定义注解 @Target:描述注解的使用范围,传入value参数指定 @Retention:描述注解的生命周期,传入value参数...

    观看韩顺平学习整理java的笔记到异常

    帮助大家复习java基础知识其中有 hashCode 2 ...@SuppressWarnings 注解 17 元注解 19 @Retention 注解 19 @Target 注解 19 @Documented注解 20 @Inherited 注解 20 异常-Exception 21 编译异常 22 异常处理 2

    Java中三种简单注解介绍和代码实例

    主要介绍了Java中三种简单注解介绍和代码实例,本文讲解了Override注解、Deprecated注解、Suppresswarnings注解、元注解等内容,需要的朋友可以参考下

    Java内功修炼系列:注解(Annotation)

    目录 一 注解的定义 二 如何自定义注解 三 元注解 3.1 @Retention 3.2 @Target 3.3 @Documented 3.4 @Inherited 3.5 @Repeatable 四 Java 预置的注解 4.1 @Deprecated 4.2 @Override ...Java 注解是从 Java5 开

    Java语言高级部分之注解是什么?

    二、JDK中预定义的一些注解1.@Override2.@Deprecated3.@SuppressWarnings4.@SafeVarargs5.@FunctionalInterface三、自定义注解1.格式2.本质3.属性4.元注解(JDK的元Annotation)4.1.@Target4.2.@Retention4.3.@...

    Java版水果管理系统源码-huihe_2020summer:2020假期spring学习,vue留给你们了,有兴趣自己可以看官方文档,中文很

    @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。 @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。 @SuppressWarnings - 指示编译器去忽略...

    Java 高级特性.doc

    @SuppressWarnings("deprecation") //在mian方法内调用一个没有定义的方法时,运行的时候将会出现这一注解! public static void main(String [] args) { Test.sayHello(); } } @SuppressWarnings 批注允许您...

    java基础案例与开发详解案例源码全

    16.2.3 抑制警告SuppressWarnings433 16.3 自定义注解类型433 16.4 对注解进行注解435 16.4.1 目标Target435 16.4.2 类型Retention436 16.4.3 文档Documented437 16.4.4 继承Inherited437 16.5 利用反射获取注解信息...

    注解

    注解 概述 给程序说,用于解释代码,java中类,方法,变量,参数和包都能被...java中预定义的注解 @override,强制格式检查 @@Deprecated,已经过时的方法标记 @SuppressWarnings(“all”),警告压制,all为所有警告压

    Java注释@interface的用法

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

Global site tag (gtag.js) - Google Analytics