`
huguangsheng
  • 浏览: 14769 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

既简单又不简单---java注解详解

阅读更多

最近在学习框架,发现框架中注解用的挺多的,似乎官方也推荐使用注解。感觉注解还是和代码耦合在了一起不像xml那样配置完全外化,可能还是xml方便维护一些。不过好处是真的非常的方便,代码极少,不像xml看起来那样的臃肿。

下面是个人的一些整理,希望对大家有点帮助:

 

1、基本概念

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

 

2、3个内建注解

@Override只能用在方法之上的,用来告诉别人这一个方法是改写父类的。

@Deprecated建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上。

@SuppressWarnings表示关闭一些不当的编译器警告信息。

 

3、4个元注解

分别为@Target,@Retention,@Documented,@Inherited。

@Target

表示该注解用于什么地方(限制注解),可能的ElemenetType参数包括:

  1. ElemenetType.CONSTRUCTOR构造器声明。
  2. ElemenetType.FIELD域声明(包括enum实例)。
  3. ElemenetType.LOCAL_VARIABLE局部变量声明。
  4. ElemenetType.METHOD方法声明。
  5. ElemenetType.PACKAGE包声明。
  6. ElemenetType.PARAMETER参数声明。
  7. ElemenetType.TYPE类,接口(包括注解类型)或enum声明。

 

@Retention

表示在什么级别保存该注解信息。可选的RetentionPolicy参数包括:

  1. RetentionPolicy.SOURCE注解将被编译器丢弃。
  1. RetentionPolicy.CLASS注解在class文件中可用,但会被VM丢弃。
  2. RetentionPolicy.RUNTIMEVM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。

 

@Documented

将此注解包含在javadoc中

 

@Inherited

允许子类继承父类中的注解

 

4、自定义注解

//定义注解  
package org.hgs.Annotation;  
  
public @interface MyAnnotation {  
    //定义属性  
    String value();  
    //属性默认值  
    String name() default "姓名";  
    int age() default 22;  
} 

 

//使用注解  
package org.hgs.Annotation;  
  
public class TestAnnotation {  
    //使用带属性的注解时,需要给属性赋值,定义时给予默认属性值,这可以不带属性值  
    @MyAnnotation(value = "good",name="张三",age=24)  
    public void getObjectInfo(){       
    }  
}  

 

 

5、下面看一个测试注解例子就一目了然了:

package org.hgs.Annotation;  
 
import java.lang.annotation.Retention;  
import java.lang.annotation.Target;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.ElementType;  
 
//定义注解  
@Retention(RetentionPolicy.RUNTIME)  
@Target({ElementType.TYPE, ElementType.METHOD})  
public @interface MyAnnotation {  
    //定义属性  
    String value();  
    //属性默认值  
    String name() default "姓名";  
    int age() default 22;  
   int[] array() default {1,2,3};  
   String color();  
} 

 

package org.hgs.Annotation;  
  
//使用注解  
@MyAnnotation(value = "good",name="张三",age=24, color = "red" ,array={3,4,5})  
public class TestAnnotation2 {  
  
    public static void main(String[] args) {  
        // 检查类AnnotationTest是否含有@MyAnnotation注解  
        if (TestAnnotation2.class.isAnnotationPresent(MyAnnotation.class)) {  
            // 若存在就获取注解  
            MyAnnotation annotation = (MyAnnotation) TestAnnotation2.class  
                    .getAnnotation(MyAnnotation.class);  
            System.out.println(annotation);  
            // 获取注解属性  
            System.out.println(annotation.color());  
            System.out.println(annotation.value());  
            // 数组  
            int[] arrs = annotation.array();  
            for (int arr : arrs) {  
                System.out.println(arr);  
            }  
        }  
   }  
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics