`

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注解大全(非常全面)

    Java标准库提供了若干内置注解,如`@Override`用于指示方法覆盖父类方法,`@Deprecated`标记已过时的方法,`@ SuppressWarnings`用于抑制编译器警告。此外,还可以自定义注解,通过`@Retention`设置保留策略(源码...

    java注解整理

    Java注解是Java编程语言中的一个重要特性,它们提供了一种元数据的方式,让开发者能够向编译器或运行时环境传递额外的信息。这些信息可以用来验证代码、自动生成代码、配置框架或者在运行时进行一些处理。注解的使用...

    Java注解实现方式

    Java注解是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,这些元数据可以被编译器或运行时环境用来执行各种任务,例如代码分析、验证、生成代码、部署等。注解提供了更加灵活和可扩展的方式来处理...

    java注解深入理解

    Java标准库提供了许多内置注解,如`@Deprecated`(表示某个API已过时)和`@ SuppressWarnings`(抑制编译器警告)。 注解的分类主要有三种: 1. **保留注解**:这些注解在编译时被处理,并且不会在字节码中保留。...

    JAVA 注解示例 详解

    1. **预定义注解**:Java标准库提供了一些预定义注解,例如: - `@Override`:确保重写父类的方法,如果方法不存在,则编译器会报错。 - `@Deprecated`:标记不再推荐使用的代码,编译器会发出警告。 - `@ ...

    java注解详解[文].pdf

    1. `@SuppressWarnings`:该注解的作用是阻止编译器发出某些警告信息。它可以有以下参数: * `deprecation`:过时的类或方法警告。 * `unchecked`:执行了未检查的转换时警告。 * `fallthrough`:当 Switch 程序...

    java 注解开发(包含详细注释,项目可以直接运行)

    - **预定义注解**:Java标准库提供了一些预定义的注解,如`@Override`、`@Deprecated`、`@ SuppressWarnings`等。 - **元注解**:用于定义注解的注解,如`@Retention`、`@Target`、`@Documented`、`@Inherited`。 ...

    最全Java注解图文超详解(建议收藏).pdf

    1. **Java标准注解**:如 `@Override`、`@Deprecated` 和 `@SuppressWarnings`。`@Override` 用于标记重写父类方法,`@Deprecated` 标记不再推荐使用的代码,`@SuppressWarnings` 可以抑制编译器警告。 2. **元注解*...

    Java 注解技术视频详解

    Java提供了三种预定义的元注解,它们分别是`@Override`、`@Deprecated`和`@ SuppressWarnings`。`@Override`用于标记重写父类方法的方法,确保编译器检查方法是否真正覆盖了父类方法;`@Deprecated`用于标记不再推荐...

    Java注解机制的应用研究.pdf

    Java注解机制是Java语言中的一个重要特性,自JDK 5.0引入以来,它已经成为了现代Java开发不可或缺的一部分。注解(Annotation)提供了一种元数据的方式,允许程序员在代码中添加额外的信息,这些信息不会直接影响...

    java注解jar包

    Java标准库中包含了一些内置注解,如@Override、@Deprecated和@SuppressWarnings等,它们分别用于标记重写父类方法、标记过时的代码以及抑制警告信息。 注解的使用通常分为三个步骤:定义、处理和使用。定义注解...

    吴天雄-Java注解及动态性详解.doc

    1. 动态编译:Java允许在运行时编译Java源代码,这通常通过`JavaCompiler`类实现,使得程序可以根据需要动态生成和编译代码。 2. 脚本引擎:如Rhino,是一个JavaScript引擎,允许在Java应用程序中执行JavaScript代码...

    Java自定义注解实例

    2. **预定义注解**: Java标准库提供了若干预定义注解,如`@Override`、`@Deprecated`、`@ SuppressWarnings`等,用于标记过载、弃用和警告控制。 3. **元注解**: 元注解是用于注解其他注解的注解,如`@Retention`、...

    java注解annotation.rar

    1. **编译时注解**:在编译期间被处理,例如`@Override`用于检查方法是否覆盖了超类的方法,`@Deprecated`标记不再推荐使用的API。 2. **运行时注解**:在运行时可以被JVM或应用程序读取,如`@NotNull`用于验证对象...

    java 注解

    Java注解是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据(metadata),这些元数据不直接影响程序的执行,但可以被编译器或运行时环境用来进行各种处理,如验证、动态代理、持久化、资源管理等。...

    java注解使用例子

    Java注解(Annotation)是Java语言提供的一种元数据机制,用于向编译器、JVM或者第三方工具提供信息。在Java程序中,注解可以被附加到类、接口、方法、变量等元素上,用于执行代码检查、生成代码、部署等任务。本篇...

    java注解解析知识要点

    Java 注解,也称为 Annotation,是自 Java 5 引入的一种元数据,它为代码提供了额外的信息,这些信息可以用于生成文档、分析代码、执行编译时检查以及在运行时处理代码。注释不会直接影响代码的执行逻辑,但可以通过...

    关于java注解的使用

    关于Java注解的使用及其深度解析 Java注解(Annotation)是Java 5引入的一种元数据(metadata)机制,用于向代码中添加附加信息,这些信息可以被编译器或者运行时环境利用,进行代码分析、生成文档或者实现某些框架功能...

Global site tag (gtag.js) - Google Analytics