Java注解
概念
  •      Annotation是Java5开始引入的特性。它提供了一种安全的类似于注释和Java doc的机制。实事上,Annotation已经被广泛用于各种Java框架,如Spring,Jersey,JUnit,TestNG。注解相当于是一种嵌入在程序中的元数据,可以使用注解解析工具或编译器对其进行解析,也可以指定注解在编译期或运行期有效。这些元数据与程序业务逻辑无关,并且是供指定的工具或框架使用的。

元注解 
  •    元注解的作用就是负责注解其他注解。Java5定义了4个标准的Meta Annotation类型,它们被用来提供对其它 Annotation类型作说明。
             @Target
             @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了@Target可更加明晰其修饰的目标。

              @Target作用:用于描述注解的使用范围,即被描述的注解可以用在什么地方
              @Target取值(ElementType )
                  CONSTRUCTOR:用于描述构造器
                  FIELD:用于描述域
                  LOCAL_VARIABLE:用于描述局部变量
                  METHOD:用于描述方法
                  PACKAGE:用于描述包
                  PARAMETER:用于描述参数
                  TYPE:用于描述类、接口(包括注解类型) 或enum声明


               @Retention
               @Retention定义了该Annotation的生命周期:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。@Retention有唯一的value作为成员。
                @Retention作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
                @Retention取值来自java.lang.annotation.RetentionPolicy的枚举类型值
                        SOURCE:在源文件中有效(即源文件保留)
                    CLASS:在class文件中有效(即class保留)
                    RUNTIME:在运行时有效(即运行时保留)
                
                @Documented
                @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。@Documented是一个标记注解,没有成员。
                @Inherited
                @Inherited 是一个标记注解。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个Annotation将被用于该class的子类。
              
自定义annotation 
  •       此时,可以为每个实现类加上特定的Annotation,并在Annotation中给该类取一个标识符,应用程序可通过该标识符来判断应该实例化哪个子类。典型的例子是结合工厂使用职责链模式。
         此时,可以为每个实现类加上特定的Annotation,并在Annotation中给该类取一个标识符,应用程序可通过该标识符来判断应该实例化哪个子类。
下面这个例子,定义了一个名为Component的Annotation,它包含一个名为identifier的成员变量。
         
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
package com.jasongj.annotation;[/font][/color][/align]import java.lang.annotation.Documented;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Component {
    String identifier () default "";
}


对于上文所说的实现类加上@Component


[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
package com.jasongj;
import com.jasongj.annotation.Component;
@Component(identifier="upper")
public class UpperCaseComponent {
    public String doWork(String input) {
        if(input != null) {
            return input.toUpperCase();
        } else {
            return null;
        }
    }
}


应用程序中可以通过反射获取UpperCaseComponent对应的identifier


[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
package com.jasongj;
import com.jasongj.annotation.Component;
public class Client {
    public static void main(String[] args) {
        try {
            Class componentClass = Class.forName("com.jasongj.UpperCaseComponent");
            if(componentClass.isAnnotationPresent(Component.class)) {
                Component component = (Component)componentClass.getAnnotation(Component.class);
                String identifier = component.identifier();
                System.out.println(String.format("Identifier for "
                    + "com.jasongj.UpperCaseComponent is ' %s '", identifier));
            } else {
                System.out.println("com.jasongj.UpperCaseComponent is not annotated by"
                        + " com.jasongj.annotation.Component");
            }
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }
}


结果如下


Identifier for com.jasongj.UpperCaseComponent is ' upper '



如果把@Component的@Retention设置为 RetentionPolicy.SOURCE或者RetentionPolicy.CLASS,则会得到如下结果,验证了上文中对@Retention的描述
阅读更多
文章标签: Java注解
想对作者说点什么? 我来说一句

java注解代码java注解代码

2011年05月17日 7KB 下载

java 课件 数组、枚举及注解

2010年12月15日 369KB 下载

Java 注解技术视频详解

2018年04月15日 44.17MB 下载

JAVA注解(Annotation).doc

2010年03月17日 48KB 下载

Java注解方式

2017年12月29日 465KB 下载

注解解析demo

2015年08月03日 6KB 下载

JAXB 生成XML文件

2015年05月22日 88KB 下载

没有更多推荐了,返回首页

不良信息举报

Java注解

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭