A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 敖东 黑马帝   /  2011-10-12 23:08  /  2669 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

给注解添加高级属性一般在什么情况下能用到?

2 个回复

倒序浏览
朱华 黑马帝 2011-10-13 00:32:49
沙发
说实话我遇见的情况很少,实际开发中注解很少被用到,而像类那样为注解定义属性并操作就更少了,但是这种应用会出现在不少有技术积累的公司的开发框架中,诸如类似于Spring与ibatis这样的持久化操作方面的模块中。
回复 使用道具 举报
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");
        }

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

评分

参与人数 1技术分 +2 收起 理由
admin + 2 迟来的爱

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马