深入理解Java注解之:注解的使用

注解是jdk1.5新增的特性.大家都知道,jdk1.5在java的发展史上有着划时代的意义.而注解的出现,在某种程度上颠覆了框架的设计.比如,spring在注解出现后,改善了原先五大组件的模式,增加了基于注解的实现方式.现在重点讲讲注解的使用.

元注解:

      jdk1.5定义了4个元注解,元注解的作用是注解其他的注解.

[email protected]

[email protected]

[email protected]

[email protected]

@Retention用于指明该注解存在的时机.参数有三个值可选:RetentionPolicy.SOURCE,RetentionPolicy.CLASS,RetentionPolicy.RUNTIME可供选择.分别表示:源码中保留注解,字节码文件中保留注解,运行时保留注解.

@Target用于指明注解能作用的范围.比如参数中设置为ElementType.TYPE,表示作用于类和接口.如果你用来注解方法,则会发生编译错误.由此可见它的功能是通过编译器实现的.

@Documented表明该注解在使用javadoc工具生成开发文档时,也会被纳入进去.

@Inherited表明,某个位置使用该注解,那么在存在Java继承关系的地方,该注解也能被继承过来.这个可能不好理解.下面的代码加以说明.

1 @Retention(RetentionPolicy.RUNTIME)
2 @Target({ElementType.TYPE,ElementType.METHOD})
3 @Inherited
4 public @interface AnnoInherited {
5
6 }

测试代码:

 1 public class TestAnnoInherated {
 2     public static void main(String[] args) {
 3         Annotation[] annos=new Goo().getClass().getAnnotations();
 4         for(Annotation a:annos){
 5             System.out.println(a);
 6         }
 7     }
 8 }
 9
10 @AnnoInherited
11 class Foo{
12
13 }
14
15 class Goo extends Foo{
16
17 }

控制台输出:

@test.annotation.AnnoInherited()

上例中Goo前面并没有加注解@AnnoInherited,但是父类Foo前面有,而@AnnoInherited加了元注解@Inherited,所以Foo能继承过来.

自定义注解:

        自定义注解的实例如下.

package test.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnimalInfo {
    String shout() default "";

    //能不能看门
    boolean isGuard() default true;
}

测试代码:

public class TestAnimalInfo {
    public static void main(String[] args) {
        Animal animal=new Animal();
        AnimalInfo info=animal.getClass().getAnnotation(AnimalInfo.class);
        if(info!=null){
            Annotation anno=info;//此处并没有报错.Annotation是一个接口.info是一个注解.这是因为编译器会将注解编译成接口,并且继承了Annotation
            System.out.println("Annotation类信息:"+Annotation.class);
            System.out.println("AnimalInfo类信息:"+AnimalInfo.class);
            Class[] cs=AnimalInfo.class.getInterfaces();
            for(Class c:cs){
                System.out.println(c);  //AnimalInfo编译后就是一个接口,并且继承了Annotation,这里得到了证实.
            }
            System.out.println("info对象的类信息:"+info.getClass());
            if("wangwang".equals(info.shout())&&info.isGuard()){
                System.out.println("the animal is a dog");
            }else if("miaomiao".equals(info.shout())&&!info.isGuard()){
                System.out.println("the animal is a cat");
            }else{
                System.out.println("the animal is not a dog or cat");
            }
        }else{
            System.out.println("it‘s not a animal");
        }
    }
}

@AnimalInfo(shout="wangwang",isGuard=true)
class Animal{

}

控制台输出:

Annotation类信息:interface java.lang.annotation.Annotation
AnimalInfo类信息:interface test.annotation.AnimalInfo
interface java.lang.annotation.Annotation
info对象的类信息:class com.sun.proxy.$Proxy1
the animal is a dog

代码分析:从控制台可以看到[email protected]注解其实编译后就是接口,并且它继承了Annnotation.而通过反射获得的注解实例,名字为$Proxy1,是一个类的对象.可见,该注解实例是JVM通过动态代理技术生成的.这也揭示了注解特性的底层实现原理.关于注解的具体底层技术原理,这里不再详谈.

时间: 2024-10-09 20:58:22

深入理解Java注解之:注解的使用的相关文章

深入理解Java:注解(Annotation)--注解处理器

深入理解Java:注解(Annotation)--注解处理器 如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器. 注解处理器类库(java.lang.reflect.AnnotatedElement): Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口.除此之外,Java在java.l

深入理解Java:注解(Annotation)自己定义注解入门

深入理解Java:注解(Annotation)自己定义注解入门 要深入学习注解.我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前.我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其它注解. Java5.0定义了4个标准的meta-annotation类型.它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected], [email protected], [email pro

深入理解Java注解类型(@Annotation)

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 深入理解Java注解类型(@Annotation) - zejian的博客 - 博客频道 - CSDN.NET zejian的博客 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅的Python,终于等到你!    &am

[2]注解(Annotation)-- 深入理解Java:注解(Annotation)自定义注解入门

转载 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 深入理解Java:注解(Annotation)自定义注解入门 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.J

深入理解java 注解(Annotation)重版

近期项目需要做权限验证,高手们写了一个权限验证的框架,看了一遍代码,还是和高手有差距啊~ 权限框架用到了一些注解反射啥的,所以回头看看以前写的文章<深入理解java 注解(Annotation)>,转过来,再做一些补充,做备忘使用. 一.什么是注解? 懒得去打了,搞一份wiki上的解释,自己看吧(以前可能会翻译一下,现在懒了) Annotation的使用方式及自定义注解 首先扫下盲,元注解就是Annotation的元注解一共有4个,分别为:@Target.@Retention.@Documen

我对java的理解(一)——注解就是贴标签

在现实生活中,贴标签这种现象比比皆是.去超市,去商场,每个或者每类物品都会有它的标签,甚至在我们自己身上也会有标签,比如,程序猿.逗逼.单身狗.80/90后.屌丝……呵呵,太多了.有时候,我们也会戏谑朋友同事,给他们贴个标签逗逗乐.但是这篇的正题是注解,下面我会说说为什么我理解的注解就是贴标签,虽然有时候也会称它为“扣帽子”. 元注解 在java提供了四个元注解,元注解就是注解的注解.它们是: 1[email protected], 2[email protected], 3[email pro

深入理解Java:注解(Annotation)基本概念

转自 竹子-博客:http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html 什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法.Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据. Annotation(注解)是JDK5.0及以后版

[3] 注解(Annotation)-- 深入理解Java:注解(Annotation)--注解处理器

转载 http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html 深入理解Java:注解(Annotation)--注解处理器 如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器. 注解处理器类库(java.lang.reflect.AnnotatedElement): Java使用

[1] 注解(Annotation)-- 深入理解Java:注解(Annotation)基本概念

转载 http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html 深入理解Java:注解(Annotation)基本概念 什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法.Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据. Ann