- 浏览: 122048 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
ningningyudabao:
final class final {
fina ...
Final -
yongtree:
转载请注明出处,OK?
浅谈DAO工厂设计模式 -
rustlingwind:
好文好文,ding~~
关于领域建模的实现 -
daoyongyu:
谢谢楼主!!向楼主学习
jspSmartUpload上传下载全攻略 -
yinleiyoung:
以前用过一段时间,貌似有中文支持的问题,不知道现在是不是已经升 ...
jspSmartUpload上传下载全攻略
Java 中的Annotation
在创建EJB组件时,必需提供一些定义,使得EJB组件使用一些服务例如:安全服务,持久化服务,事务服务。EJB容器可以提供这些服务,这样EJB只要实现业务逻辑就可以了。但是说到底EJB容器使用EJB组件的元数据来提供这些服务,在以前EJB的元数据是以XML配置文件形式出现的,这些配置文件与EJB源文件是分开的。
EJB的部署人员无法了解EJB本身的信息,如果EJB组件的创建者用注释(Annotation)的方法将这些配置服务的信息和代码放在一起,这样EJB的部署者就可以了解EJB的信息,EJB的home接口可以使用Annotation自动生成,当然到目前为止更好的是在简单的Java Object上使用Annotations。
一.什么是Annotation
在已经发布的JDK1.5(tiger)中增加新的特色叫 Annotation。Annotation提供一种机制,将程序的元素如:类,方法,属性,参数,本地变量,包和元数据联系起来。这样编译器可以将元数据存储在Class文件中。 这样虚拟机和其它对象可以根据这些元数据来决定如何使用这些程序元素或改变它们的行为。
二.定义一个简单的Annotation并使用它
1.定义Annotation
定义一个Annotation是什么简单的,它采取的是类似于Interface的定义方式: “@+annotation类型名称+(..逗号分割的name-value对...)”
//Example 1
package sz.starbex.bill.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SimpleAnnotation {
String value();
}
@Retention这个meta-annotation表示我们创建的SimpleAnnotation这个Annotation将会存储在Class文件中,并在java
VM运行时加载它。@Target这个meta-annotation表示我们创建的SimplwAnnotation将会为描述方法,而@interface SimpleAnnotation是我们自定义的Annotation,它有一个成员叫value,返回值是String
2.使用Annotation
//Example 2
package sz.starbex.bill.annotation;
import sz.starbex.bill.annotation.SimpleAnnotation;
public class UsingSimpleAnnotation {
@SimpleAnnotation(value="Pass:This method will Pass")//注意name=value的用法
public void pass(){
if(10>5) System.out.println("测试通过");
}
@SimpleAnnotation("Fail:This method will Fail")//注意name=value的用法
public void fail(){
if(10<5) System.out.println("测试失败");
}
}
一个Annotation用于程序元素(在本例中是method),在method方法之前用(@Annotation名称(name=value,name=value.....)。在本例中是@SimpleAnnotation(value="Pass:This method will Pass")。每个annotation具有一个名字和成员个数>=0,当只有一个单一的成员时,这个成员就是value。我们也可以这样写 @SimpleAnnotation("Fail:This method will Fail")。至此@SimpleAnnotation将Pass和Fail联系起来了。
3.在运行时访问Annotation
一旦Annotation与程序元素联系起来,我们可以通过反射访问它们并可以取得它们的值。我们使用一个新的interface:java.lang.reflect.AnnotatedElement。java.lang.reflect.AnnotatedElement接口中的方法有:
a. boolean isAnnotationPresent(Class<? extends Annotation> annotationType)
如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
b. <T extends Annotation> T getAnnotation(Class<T> annotationType)
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
c. Annotation[] getAnnotations()
返回此元素上存在的所有注释。
d. Annotation[] getDeclaredAnnotations()
返回直接存在于此元素上的所有注释。
你要注意 isAnnotationPresent和getAnnotation方法,它们使用了Generics,请参考我的Java 范型的Blog。
下面我们列出一些实现了AnnotatedElement 接口的类
1. java.lang.reflect.AccessibleObject
2. java.lang.Class
3. java.lang.reflect.Constructor
4. java.lang.reflect.Field
5. java.lang.reflect.Method
6. java.lang.Package
下面的Example程序说明了如何在运行环境访问Annotation
package sz.starbex.bill.annotation;
import sz.starbex.bill.annotation.SimpleAnnotation;
import java.lang.reflect.Method;
public class SimpleAccessAnnotation {
static void accessAnnotationTest(Class usingAnnnotationClass){
try {
//Object usingAnnnotationClass=Class.forName(usingAnnotationClassName).newInstance();
Method [] methods=usingAnnnotationClass.getDeclaredMethods();//取得对方法
for(Method method:methods){
System.out.println(method.getName());
SimpleAnnotation
simpleAnnotation=method.getAnnotation(SimpleAnnotation.class);//得到方法的Annotation
if(simpleAnnotation!=null){
System.out.print(simpleAnnotation.value()+"==");
String result=invoke(method,usingAnnnotationClass);
System.out.println(result);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
static String invoke(Method m, Object o) {
String result = "passed";
try {
m.invoke(m,new Object[]{});
} catch (Exception e) {
// TODO Auto-generated catch block
result = "failed";
}
return result;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
accessAnnotationTest(UsingSimpleAnnotation.class);
}
}
以上是简单的简绍Annotation,让大家对Annotation有一个初步的了解,下面二会简绍Annotation的定义和语法
Java 中的Annotation的定义
Java中的Annotation
Java定义了几个标准的meta-annotation.在新Package中java.lang.annotation 中包含了以下meta-annotation:
meta-annotation 说明
@Target 1. annotation的target是一个被标注的程序元素。target说明了annotation所修饰的对象范围:annotation可被用于packages、types(类、接口、枚举、annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在annotation类型的声明中使用了target可更加明晰其修饰的目标。
meta-annotation 说明
@Target 1. annotation的target是一个被标注的程序元素。target说明了annotation所修饰的对象范围:annotation可被用于packages、types(类、接口、枚举、annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在annotation类型的声明中使用了target可更加明晰其修饰的目标。
2. ElementType的定义
TYPE // Class, interface, or enum (but not annotation)
FIELD// Field (including enumerated values)
METHOD// Method (does not include constructors)
PARAMETER// Method parameter
CONSTRUCTOR// Constructor
LOCAL_VARIABLE// Local variable or catch clause
ANNOTATION_TYPE// Annotation Types (meta-annotations)
PACKAGE// Java package
@Retention 1. SOURCE//按照规定使用注释,但是并不将它保留到编译后的类文件中
2. CLASS//将注释保留在编译后的类文件中,但是在运行时忽略它
3. RUNTIME//将注释保留在编译后的类文件中,并在第一次加载类时读取它
@Documented Documented 表示注释应该出现在类的 Javadoc 中
@Inherited 一个Annotation将被继承
三个标准的Annotation 在java.lang包中:
@Deprecated 对不再使用的方法进行注释
@Override 指明注释的方法覆盖超类的方法
@SuppressWarnings 阻止编译器的警告,例:当类型不安全时
下例来说明这三个标准的Annotation:
package sz.starbex.bill.annotation;
import java.util.ArrayList;
import java.util.List;
public class SimpleOverrideAnnotation {
public static void main(String[] args) {
SimpleOverrideAnnotation test = new SimpleOverrideAnnotation();
System.out.println(test.toString());
}
@Override
public String toString() {
return "自己的类自己输出";
}
@Deprecated
public void doSomething() {
System.out.println("方法已过时" );
}
@SuppressWarnings(value=)
public void testSuppressWarnings(){
List testList=new ArrayList();
testList.add("KKKK");//没有使用范型,类型不安全
}
}
Annotation使用实例
1.一个组合的Annotation,注释类的
a. 商标Annotation
package sz.starbex.bill.annotation;
public @interface Trademark {
String name();
String owner();
}
b.License的annotation
package sz.starbex.bill.annotation;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.PACKAGE})
public @interface License {
String name();
String notice();
boolean redistributable();
Trademark[] trademarks();
}
c.测试类
package sz.starbex.bill.annotation;
@License(name="Bill",
notice="许可证",
redistributable=true,
trademarks={@Trademark(name="Mercedes",owner="Swedish"),
@Trademark(name="Daewoo",owner="Korean")
}
)
public class TestLicenseAnnotation {
public static void main(String[] args) {
TestLicenseAnnotation test=new TestLicenseAnnotation();
License license=test.getClass().getAnnotation(License.class);
System.out.println("License发放人:"+license.name());
System.out.println("License注意事项:"+license.notice());
System.out.println("License许可:"+license.redistributable());
Trademark [] marks=license.trademarks();
for(Trademark mark:marks){
System.out.println("商标名称:"+mark.name());
System.out.println("商标的使用者:"+mark.owner());
}
}
}
在创建EJB组件时,必需提供一些定义,使得EJB组件使用一些服务例如:安全服务,持久化服务,事务服务。EJB容器可以提供这些服务,这样EJB只要实现业务逻辑就可以了。但是说到底EJB容器使用EJB组件的元数据来提供这些服务,在以前EJB的元数据是以XML配置文件形式出现的,这些配置文件与EJB源文件是分开的。
EJB的部署人员无法了解EJB本身的信息,如果EJB组件的创建者用注释(Annotation)的方法将这些配置服务的信息和代码放在一起,这样EJB的部署者就可以了解EJB的信息,EJB的home接口可以使用Annotation自动生成,当然到目前为止更好的是在简单的Java Object上使用Annotations。
一.什么是Annotation
在已经发布的JDK1.5(tiger)中增加新的特色叫 Annotation。Annotation提供一种机制,将程序的元素如:类,方法,属性,参数,本地变量,包和元数据联系起来。这样编译器可以将元数据存储在Class文件中。 这样虚拟机和其它对象可以根据这些元数据来决定如何使用这些程序元素或改变它们的行为。
二.定义一个简单的Annotation并使用它
1.定义Annotation
定义一个Annotation是什么简单的,它采取的是类似于Interface的定义方式: “@+annotation类型名称+(..逗号分割的name-value对...)”
//Example 1
package sz.starbex.bill.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SimpleAnnotation {
String value();
}
@Retention这个meta-annotation表示我们创建的SimpleAnnotation这个Annotation将会存储在Class文件中,并在java
VM运行时加载它。@Target这个meta-annotation表示我们创建的SimplwAnnotation将会为描述方法,而@interface SimpleAnnotation是我们自定义的Annotation,它有一个成员叫value,返回值是String
2.使用Annotation
//Example 2
package sz.starbex.bill.annotation;
import sz.starbex.bill.annotation.SimpleAnnotation;
public class UsingSimpleAnnotation {
@SimpleAnnotation(value="Pass:This method will Pass")//注意name=value的用法
public void pass(){
if(10>5) System.out.println("测试通过");
}
@SimpleAnnotation("Fail:This method will Fail")//注意name=value的用法
public void fail(){
if(10<5) System.out.println("测试失败");
}
}
一个Annotation用于程序元素(在本例中是method),在method方法之前用(@Annotation名称(name=value,name=value.....)。在本例中是@SimpleAnnotation(value="Pass:This method will Pass")。每个annotation具有一个名字和成员个数>=0,当只有一个单一的成员时,这个成员就是value。我们也可以这样写 @SimpleAnnotation("Fail:This method will Fail")。至此@SimpleAnnotation将Pass和Fail联系起来了。
3.在运行时访问Annotation
一旦Annotation与程序元素联系起来,我们可以通过反射访问它们并可以取得它们的值。我们使用一个新的interface:java.lang.reflect.AnnotatedElement。java.lang.reflect.AnnotatedElement接口中的方法有:
a. boolean isAnnotationPresent(Class<? extends Annotation> annotationType)
如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
b. <T extends Annotation> T getAnnotation(Class<T> annotationType)
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
c. Annotation[] getAnnotations()
返回此元素上存在的所有注释。
d. Annotation[] getDeclaredAnnotations()
返回直接存在于此元素上的所有注释。
你要注意 isAnnotationPresent和getAnnotation方法,它们使用了Generics,请参考我的Java 范型的Blog。
下面我们列出一些实现了AnnotatedElement 接口的类
1. java.lang.reflect.AccessibleObject
2. java.lang.Class
3. java.lang.reflect.Constructor
4. java.lang.reflect.Field
5. java.lang.reflect.Method
6. java.lang.Package
下面的Example程序说明了如何在运行环境访问Annotation
package sz.starbex.bill.annotation;
import sz.starbex.bill.annotation.SimpleAnnotation;
import java.lang.reflect.Method;
public class SimpleAccessAnnotation {
static void accessAnnotationTest(Class usingAnnnotationClass){
try {
//Object usingAnnnotationClass=Class.forName(usingAnnotationClassName).newInstance();
Method [] methods=usingAnnnotationClass.getDeclaredMethods();//取得对方法
for(Method method:methods){
System.out.println(method.getName());
SimpleAnnotation
simpleAnnotation=method.getAnnotation(SimpleAnnotation.class);//得到方法的Annotation
if(simpleAnnotation!=null){
System.out.print(simpleAnnotation.value()+"==");
String result=invoke(method,usingAnnnotationClass);
System.out.println(result);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
static String invoke(Method m, Object o) {
String result = "passed";
try {
m.invoke(m,new Object[]{});
} catch (Exception e) {
// TODO Auto-generated catch block
result = "failed";
}
return result;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
accessAnnotationTest(UsingSimpleAnnotation.class);
}
}
以上是简单的简绍Annotation,让大家对Annotation有一个初步的了解,下面二会简绍Annotation的定义和语法
Java 中的Annotation的定义
Java中的Annotation
Java定义了几个标准的meta-annotation.在新Package中java.lang.annotation 中包含了以下meta-annotation:
meta-annotation 说明
@Target 1. annotation的target是一个被标注的程序元素。target说明了annotation所修饰的对象范围:annotation可被用于packages、types(类、接口、枚举、annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在annotation类型的声明中使用了target可更加明晰其修饰的目标。
meta-annotation 说明
@Target 1. annotation的target是一个被标注的程序元素。target说明了annotation所修饰的对象范围:annotation可被用于packages、types(类、接口、枚举、annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在annotation类型的声明中使用了target可更加明晰其修饰的目标。
2. ElementType的定义
TYPE // Class, interface, or enum (but not annotation)
FIELD// Field (including enumerated values)
METHOD// Method (does not include constructors)
PARAMETER// Method parameter
CONSTRUCTOR// Constructor
LOCAL_VARIABLE// Local variable or catch clause
ANNOTATION_TYPE// Annotation Types (meta-annotations)
PACKAGE// Java package
@Retention 1. SOURCE//按照规定使用注释,但是并不将它保留到编译后的类文件中
2. CLASS//将注释保留在编译后的类文件中,但是在运行时忽略它
3. RUNTIME//将注释保留在编译后的类文件中,并在第一次加载类时读取它
@Documented Documented 表示注释应该出现在类的 Javadoc 中
@Inherited 一个Annotation将被继承
三个标准的Annotation 在java.lang包中:
@Deprecated 对不再使用的方法进行注释
@Override 指明注释的方法覆盖超类的方法
@SuppressWarnings 阻止编译器的警告,例:当类型不安全时
下例来说明这三个标准的Annotation:
package sz.starbex.bill.annotation;
import java.util.ArrayList;
import java.util.List;
public class SimpleOverrideAnnotation {
public static void main(String[] args) {
SimpleOverrideAnnotation test = new SimpleOverrideAnnotation();
System.out.println(test.toString());
}
@Override
public String toString() {
return "自己的类自己输出";
}
@Deprecated
public void doSomething() {
System.out.println("方法已过时" );
}
@SuppressWarnings(value=)
public void testSuppressWarnings(){
List testList=new ArrayList();
testList.add("KKKK");//没有使用范型,类型不安全
}
}
Annotation使用实例
1.一个组合的Annotation,注释类的
a. 商标Annotation
package sz.starbex.bill.annotation;
public @interface Trademark {
String name();
String owner();
}
b.License的annotation
package sz.starbex.bill.annotation;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.PACKAGE})
public @interface License {
String name();
String notice();
boolean redistributable();
Trademark[] trademarks();
}
c.测试类
package sz.starbex.bill.annotation;
@License(name="Bill",
notice="许可证",
redistributable=true,
trademarks={@Trademark(name="Mercedes",owner="Swedish"),
@Trademark(name="Daewoo",owner="Korean")
}
)
public class TestLicenseAnnotation {
public static void main(String[] args) {
TestLicenseAnnotation test=new TestLicenseAnnotation();
License license=test.getClass().getAnnotation(License.class);
System.out.println("License发放人:"+license.name());
System.out.println("License注意事项:"+license.notice());
System.out.println("License许可:"+license.redistributable());
Trademark [] marks=license.trademarks();
for(Trademark mark:marks){
System.out.println("商标名称:"+mark.name());
System.out.println("商标的使用者:"+mark.owner());
}
}
}
发表评论
-
SUN网站:JDK及API的下载
2008-06-29 14:27 4017SUN网站:JDK及API的下载 第1步:打开sun官方网 ... -
Java中的日期处理练习
2008-06-29 14:26 1570Java中的日期处理练习 ... -
Java虚拟机类装载--原理、实现与应用
2008-06-29 14:26 853Java虚拟机类装载--原理、实现与应用 一、引言 ... -
实例分析Java SE 6.0新增功能
2008-06-29 14:25 1231实例分析Java SE 6.0新增功能 Jav ... -
Java克隆(Clone)的应用
2008-06-29 14:25 833Java克隆(Clone)的应用 ... -
java数据类型转换
2008-06-29 14:24 1073java数据类型转换 一些初学JAVA的朋友可能会遇到JA ... -
Java基础知识:初学者必须理解的六大问题
2008-06-29 14:24 804Java基础知识:初学者必 ... -
如何才算掌握JAVA
2008-06-29 14:23 721如何才算掌握JAVA 时常看到一些人说掌握了Java,但是 ... -
Final
2008-06-29 13:56 1281Final final在Java中并不常用,然而它却为我们 ... -
关于不可变类和可变类
2008-06-29 13:56 973关于不可变类和可变类 所谓不可变类,是指当创建了这个类的实 ... -
初始化顺序
2008-06-29 13:55 870初始化顺序 1、调用顺 ...
相关推荐
Java 5引入的注解(Annotation)是一种元数据,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、JVM或其他工具在编译时或运行时使用。注解可以用来简化代码,提高可维护性,并帮助工具进行静态分析。 1. ...
Java-Annotation使用大全 Java-Annotation使用大全 Java-Annotation使用大全
Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是一种描述数据的数据,可以提供有关代码的附加信息,而这些信息并不直接影响代码的执行。在Java中,注解用于向编译器、JVM或...
Java annotation 什么是java annotation?annotation 的7种标注类型。nnotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、...
Java Annotation(注解)是自 Java 5.0 开始引入的一种语言元素,它为开发者提供了在代码中添加元数据的能力。简单来说,注解就像是对代码进行标记或注释的方式,这些标记可以在编译时或者运行时被读取并执行特定的...
Java 1.5 引入了一种新的元编程机制——注解(Annotation),极大地增强了代码的可读性和可维护性。注解是一种在代码中添加元数据的方式,它允许程序员在源代码上添加一些信息,这些信息可以被编译器或运行时环境...
在"java annotation demo"中,我们将探讨如何创建和使用注解以及如何通过反射来获取和处理这些注解。 首先,注解的定义通常使用`@interface`关键字。例如,我们创建一个简单的`MyAnnotation`注解: ```java public...
Java Annotation 是 JDK5.0 引入的一种元数据机制,它允许程序员在代码中嵌入额外的信息,这些信息可以被编译器、构建工具或运行时系统用来执行特定的任务。Annotation 提供了一种安全、灵活的方式来描述代码的属性...
Java注解(JDK5)是Java编程语言中的一个重要特性,自Java 5版本开始引入。注解(Annotation)提供了一种元数据的形式,允许程序员在代码中嵌入额外的信息,这些信息可以被编译器、JVM或者专门的处理工具在编译时或...
通过上述示例中的JavaAnnotation压缩包,你可能包含了注解的使用示例、源码以及相关的博客文章。源码可以帮助你理解注解的实际应用,而博客文章可能深入解释了注解的工作原理和最佳实践。学习这些材料,将有助于你...
Java Annotation 是一种元数据,它为程序元素(如包、类、方法等)提供附加信息。这些信息不直接影响代码的执行,但可以被编译器、工具或运行时系统用来进行各种处理,如代码分析、验证、代码生成等。Annotation 以 ...
元数据在编程中扮演着至关重要的角色,尤其是在Java中,通过注解(Annotation)这一特性,元数据被广泛应用于多个方面,包括但不限于文档生成、代码分析以及编译时的检查。尽管元数据作用的分类并未有固定的标准,但...
Java SSH项目是基于三个主要框架——Struts、Spring和Hibernate构建的企业级Web应用程序。这个项目中,Hibernate作为ORM...Hibernate注解的使用简化了数据库配置,提高了开发效率,是现代Java开发中常见的技术栈选择。
在Java编程语言中,注解(Annotation)是一种元数据,它提供了在编译时或运行时处理代码的一种方式。通过注解,开发者可以向编译器或JVM提供有关代码的附加信息,而这些信息通常不直接影响程序的执行,但可以用于...
Java.Annotation注解.part4
Java.Annotation注解.part3
Java.Annotation注解.part2
Java.Annotation注解.part1