黑马程序员技术交流社区

标题: 注解 [打印本页]

作者: 敖东    时间: 2011-10-12 23:08
标题: 注解
给注解添加高级属性一般在什么情况下能用到?
作者: 朱华    时间: 2011-10-13 00:32
说实话我遇见的情况很少,实际开发中注解很少被用到,而像类那样为注解定义属性并操作就更少了,但是这种应用会出现在不少有技术积累的公司的开发框架中,诸如类似于Spring与ibatis这样的持久化操作方面的模块中。
作者: 赵玉成    时间: 2011-10-13 03:30
java用public @interface   Annotation
{
} 定义一个注解 @Annotation
   
@Override  @Deprecated  @SuppressWarnings为常见的3个注解,注解@Retention可以用来修饰注解。

Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。

RetentionPolicy有3个值:CLASS  RUNTIME   SOURCE

用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;

用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;

用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,所以他们可以用反射的方式读取。RetentionPolicy.RUNTIME 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用.

举个例子:定义一个注解@MyAnnotation,用@Retention注解修饰,属性为(RetentionPolicy.RUNTIME )
   @Retention(RetentionPolicy.RUNTIME)
     public @interface MyAnnotation
{

}

定义一个类MyTest, @MyAnnotation注解修饰output方法

public class MyTest
{
        @MyAnnotation
        public void output()
        {
                System.out.println("exists Annotation");
        }
}

下面用反射来判断注解是否调用output()方法:

          public static void main(String[] args) throws Exception
        {
                MyTest myTest = new MyTest();

                Class<MyTest> c = MyTest.class;

                Method method = c.getMethod("output", new Class[] {});

                if (method.isAnnotationPresent(MyAnnotation.class))

                //// 如果@MyAnnotation 注解 在 output 方法上面的话 则if 返回 TURE
                {
                        method.invoke(myTest, new Object[] {});

                }

                else
                        System.out.println("no Annotation");

        }

所以上面程序打印:exists Annotation
如果Retention 修饰@MyAnnotation 为
  @Retention(RetentionPolicy.CLASS)或RetentionPolicy.SOURCE,程序打印no Annotation

以上为注解属性在程序中应用的一个例子,注解@Target还用来限定Annotation的使用对象,它有一个属性ElementType也是枚举类型,值为:ANNOTATION_TYPE    CONSTRUCTOR     FIELD     LOCAL_VARIABLE    METHOD    PACKAGE     PARAMETER
TYPE
如@Target(ElementType.METHOD) 修饰的注解表示该注解只能用来修饰在方法上。
注解大都用来在开发框架中吧,我也不太清楚,听老师说的0-0…… Junit4 测试框架就是基于注解实现的吧,如在Junit4 中这样写:

public class MyTest
{
    @Test
   
        public void hello()
        {
                System.out.println("w kao ha ha");
        }

}
程序就可以直接运行,应该是基于注解加反射实现的…………
以上是我学习的总结,希望对大家有帮助啊…………






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2