JAVA 注解:SuppressWarnings、Deprecated、Override

为了是大家初步了解什么是注解(Annotation),我们先来看如下代码: 
相关代码一: 
Java代码   收藏代码
  1. public class AnnotationTest {  
  2. public static void main(String[] args) {  
  3.     Date nowDate = new Date();  
  4.     String strDate = nowDate.toLocaleString();  
  5.     System.out.println(strDate);// 2009-12-27 16:44:09  
  6. }  
  7. }  

上述代码在eclipse编辑器中会出现警告,内容为"The method toLocaleString() from the type Date is deprecated",它的意思是说toLocaleString()方法是个过时的方法; 
为了更好的理解它的含义,我们在cmd窗口来编译它,如下 

 



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


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

2.在写程序中,我们可能不希望某个方法之后不被再次调用,那么我们就可以把这个方法定义为过时的方法,过时的方法在调用时,会在方法名上打上删除线,告诉程序员该方法为过时方法,最后不要再用了。下面我们写一个自定义的过时方法: 
相关代码二: 
Java代码   收藏代码
  1. public class AnnotationTest {  
  2.   
  3. @Deprecated  
  4. private static void sayHello() {  
  5.     System.out.println("Hello word !");  
  6. }  
  7. public static void main(String[] args) {  
  8.     AnnotationTest.sayHello();  
  9. }  
  10. }  


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

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

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

5.通常应用注解有如下三个步骤: 
1).定义注解类,格式为:
Java代码   收藏代码
  1. public @interface A{  
  2. }  

2).应用注解类,如: 
Java代码   收藏代码
  1. @A  
  2. class B{  
  3. }  

3).对应用注解类的类进行反射操作(的类),如: 
Java代码   收藏代码
  1. B.class.isAnnotationPresent(A.class);  
  2. A a = B.class.isAnnotationPresent(A.class);  


6.下面我们来完成上述三步操作: 
1).切换到java透视图上,点击新建一个注解: 
代码如: 
Java代码   收藏代码
  1. public @interface MyAnnotation {  
  2. }  

2).创建一个类应用该注解: 
Java代码   收藏代码
  1. @MyAnnotation  
  2. public class AnnotationTest {  
  3. public static void main(String[] args) {  
  4. }  
  5. }  

3.对应用注解类的类进行反射操作: 
Java代码   收藏代码
  1. public static void main(String[] args) {  
  2.     if (AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) {  
  3.       MyAnnotation myAnnotation = AnnotationTest.class.getAnnotation(MyAnnotation.class);  
  4.       System.out.println(myAnnotation);  
  5.     }  
  6. }  

注:这是程序运行没有输出,明明有注解,怎么会没输出呢?这时我们在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注解类增加一个属性,代码如下: 
代码: 
Java代码   收藏代码
  1. @Retention(RetentionPolicy.RUNTIME)  
  2. @Target({ElementType.METHOD,ElementType.TYPE})  
  3. public @interface MyAnnotation {  
  4. String color();  
  5. }  

那么此时,我们就会发现,AnnotationTest类的上面有错误提示“The annotation @MyAnnotation must define the attribute color”,即必定义color的属性,我们此时就可以把类上面的注解修改成:@MyAnnotation(color="red"),OK了!说明注解类有属性时,在我们调用时就必须提供属性值,除非注解类中的属性有默认值, 
代码: 
Java代码   收藏代码
  1. @Retention(RetentionPolicy.RUNTIME)  
  2. @Target({ElementType.METHOD,ElementType.TYPE})  
  3. public @interface MyAnnotation {  
  4. String color() default "yellow";  
  5. }  

调用的时候就可以直接:@MyAnnotation或@MyAnnotation(); 

再如代码: 
Java代码   收藏代码
  1. public @interface MyAnnotation {  
  2. String color() default "yellow";  
  3. String style();  
  4. }  

调用的时候就可以直接: @MyAnnotation(color="red",style="fashion")或@MyAnnotation(style="fashion");有默认值的时候,默认值可以省略。 

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

再如代码: 
Java代码   收藏代码
  1. public @interface MyAnnotation {  
  2. String color() default "yellow";  
  3. String style() default "fashion";  
  4. String value();  
  5. }  

调用的时候就可以直接: @MyAnnotation(color="red",style="fashion",value="hello") 
或@MyAnnotation("hello"); 

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值