Java注解

Java注解
Java注解

Java注解(Annotation)

(1) Annotation(注释)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注释是以‘@注释名’在代码中存在的,根据注释参数的个数,我们可以将注释分为:标记注释、单值注释、完整注释三类。它们都不会直接影响到程序的语义,只是作为注释(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。另外,你可以在编译时选择代码里的注释是否只存在于源代码级,或者它也能在class文件中出现。

元数据的作用

如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:

编写文档:通过代码里标识的元数据生成文档。

代码分析:通过代码里标识的元数据对代码进行分析。

编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。

基本内置注释

@Override

Java代码

1. package com.iwtxokhtd.annotation;

2. /**

3. * 测试Override注解

4. * @author Administrator

5. *

6. */

7. public class OverrideDemoTest {

8.

9. //@Override

10. public String tostring(){

11. return "测试注释";

12. }

13. }

package com.iwtxokhtd.annotation;

/**

* 测试Override注解

* @author Administrator

*

public class OverrideDemoTest {

//@Override

public String tostring(){

return "测试注释";

}

}

@Deprecated的作用是对不应该在使用的方法添加注释,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的@deprecated标记有相同的功能,准确的说,它还不如javadoc @deprecated,因为它不支持参数,使用@Deprecated的示例代码示例如下:

Java代码

1. package com.iwtxokhtd.annotation;

2. /**

3. * 测试Deprecated注解

4. * @author Administrator

5. *

6. */

7. public class DeprecatedDemoTest {

8. public static void main(String[] args) {

9. //使用DeprecatedClass里声明被过时的方法

10. DeprecatedClass.DeprecatedMethod();

11. }

12. }

13. class DeprecatedClass{

14. @Deprecated

15. public static void DeprecatedMethod() {

16. }

17. }

package com.iwtxokhtd.annotation;

/**

* 测试Deprecated注解

* @author Administrator

*/

public class DeprecatedDemoTest {

public static void main(String[] args) {

//使用DeprecatedClass里声明被过时的方法

DeprecatedClass.DeprecatedMethod();

}

}

class DeprecatedClass{

@Deprecated

public static void DeprecatedMethod() {

}

}

@SuppressWarnings,其参数有:

deprecation,使用了过时的类或方法时的警告

unchecked,执行了未检查的转换时的警告

fallthrough,当Switch 程序块直接通往下一种情况而没有Break 时的警告path,在类路径、源文件路径等中有不存在的路径时的警告

serial,当在可序列化的类上缺少serialVersionUID 定义时的警告

finally ,任何finally 子句不能正常完成时的警告

all,关于以上所有情况的警告

Java代码

1. package com.iwtxokhtd.annotation;

2.

3. import java.util.ArrayList;

4. import java.util.List;

5.

6. public class SuppressWarningsDemoTest {

7.

8. public static List list=new ArrayList();

9. @SuppressWarnings("unchecked")

10. public void add(String data){

11. list.add(data);

12. }

13. }

package com.iwtxokhtd.annotation;

import java.util.ArrayList;

import java.util.List;

public class SuppressWarningsDemoTest {

public static List list=new ArrayList();

@SuppressWarnings("unchecked")

public void add(String data){

list.add(data);

}

}

(2)自定义注释

它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为@interface,如下例:Java代码

1. public @interface NewAnnotation {

2. }

public @interface NewAnnotation {

}

使用自定义的注释类型

Java代码

1. public class AnnotationTest {

2. @NewAnnotation

3. public static void main(String[] args) {

4. }

5. }

public class AnnotationTest {

@NewAnnotation

public static void main(String[] args) {

}

}

为自定义注释添加变量

Java代码

1. public @interface NewAnnotation {

2. String value();

3. }

public @interface NewAnnotation {

String value();

}

Java代码

1. public class AnnotationTest {

2. @NewAnnotation("main method")

3. public static void main(String[] args) {

4. saying();

5. }

6. @NewAnnotation(value = "say method")

7. public static void saying() {

8. }

9. }

public class AnnotationTest {

@NewAnnotation("main method")

public static void main(String[] args) {

saying();

}

@NewAnnotation(value = "say method")

public static void saying() {

}

}

定义一个枚举类型,然后将参数设置为该枚举类型,并赋予默认值

Java代码

1. public @interface Greeting {

2. public enum FontColor{

3. BLUE,RED,GREEN

4. };

5. String name();

6. FontColor fontColor() default FontColor.RED;}

7. }

public @interface Greeting {

public enum FontColor{

BLUE,RED,GREEN

};

String name();

FontColor fontColor() default FontColor.RED;}

}

这里有两种选择,其实变数也就是在赋予默认值的参数上,我们可以选择使用该默认值,也可以重新设置一个值来替换默认值

Java代码

1. @NewAnnonation("main method")

2. public static void main(String[] args) {

3. saying();

4. sayHelloWithDefaultFontColor();

5. sayHelloWithRedFontColor();

6.

7. }

8. @NewAnnonation("say method")

9. public static void saying(){

10.

11. }

12. //此时的fontColor为默认的RED

13. @Greeting(name="defaultfontcolor")

14. public static void sayHelloWithDefaultFontColor() {

15.

16. }

17. //现在将fontColor改为BLUE

18. @Greeting(name="notdefault",fontColor=Greeting.FontColor.BLUE)

19. public static void sayHelloWithRedFontColor() {

20.

21. }

@NewAnnonation("main method")

public static void main(String[] args) {

saying();

sayHelloWithDefaultFontColor();

sayHelloWithRedFontColor();

}

@NewAnnonation("say method")

public static void saying(){

}

//此时的fontColor为默认的RED

@Greeting(name="defaultfontcolor")

public static void sayHelloWithDefaultFontColor() {

}

//现在将fontColor改为BLUE

@Greeting(name="notdefault",fontColor=Greeting.FontColor.BLUE)

public static void sayHelloWithRedFontColor() {

}

(3)注释的高级应用

限制注释的使用范围

用@Target指定ElementType属性

Java代码

1. package https://www.360docs.net/doc/6314398757.html,ng.annotation;

2. public enum ElementType {

3. TYPE,

4. // 用于类,接口,枚举但不能是注释

5. FIELD,

6. // 字段上,包括枚举值

7. METHOD,

8. // 方法,不包括构造方法

9. PARAMETER,

10. // 方法的参数

11. CONSTRUCTOR,

12. //构造方法

13. LOCAL_V ARIABLE,

14. // 本地变量或catch语句

15. ANNOTATION_TYPE,

16. // 注释类型(无数据)

17. PACKAGE

18. // Java包

19. }

package https://www.360docs.net/doc/6314398757.html,ng.annotation;

public enum ElementType {

TYPE,

// 用于类,接口,枚举但不能是注释FIELD,

// 字段上,包括枚举值

METHOD,

// 方法,不包括构造方法PARAMETER,

// 方法的参数

CONSTRUCTOR,

//构造方法

LOCAL_VARIABLE,

// 本地变量或catch语句

ANNOTA TION_TYPE,

// 注释类型(无数据)

PACKAGE

// Java包

}

注解保持性策略

Java代码

1. //限制注解使用范围

2. @Target({ElementType.METHOD,ElementType.CONSTRUCTOR})

3. public @interface Greeting {

4.

5. //使用枚举类型

6. public enum FontColor{

7. BLUE,RED,GREEN

8. };

9. String name();

10. FontColor fontColor() default FontColor.RED;

11. }

//限制注解使用范围

@Target({ElementType.METHOD,ElementType.CONSTRUCTOR}) public @interface Greeting {

//使用枚举类型

public enum FontColor{

BLUE,RED,GREEN

};

String name();

FontColor fontColor() default FontColor.RED;

}

在Java编译器编译时,它会识别在源代码里添加的注释是否还会保留,这就是RetentionPolicy。下面是Java定义的RetentionPolicy枚举:

编译器的处理有三种策略:

将注释保留在编译后的类文件中,并在第一次加载类时读取它

将注释保留在编译后的类文件中,但是在运行时忽略它

按照规定使用注释,但是并不将它保留到编译后的类文件中

Java代码

1. package https://www.360docs.net/doc/6314398757.html,ng.annotation;

2. public enum RetentionPolicy {

3. SOURCE,

4. // 此类型会被编译器丢弃

5. CLASS,

6. // 此类型注释会保留在class文件中,但JVM会忽略它

7. RUNTIME

8. // 此类型注释会保留在class文件中,JVM会读取它

9. }

package https://www.360docs.net/doc/6314398757.html,ng.annotation;

public enum RetentionPolicy {

SOURCE,

// 此类型会被编译器丢弃

CLASS,

// 此类型注释会保留在class文件中,但JVM会忽略它

RUNTIME

// 此类型注释会保留在class文件中,JVM会读取它

}

Java代码

1. //让保持性策略为运行时态,即将注解编码到class文件中,让虚拟机读取

2. @Retention(RetentionPolicy.RUNTIME)

3. public @interface Greeting {

4.

5. //使用枚举类型

6. public enum FontColor{

7. BLUE,RED,GREEN

8. };

9. String name();

10. FontColor fontColor() default FontColor.RED;

11. }

//让保持性策略为运行时态,即将注解编码到class文件中,让虚拟机读取

@Retention(RetentionPolicy.RUNTIME)

public @interface Greeting {

//使用枚举类型

public enum FontColor{

BLUE,RED,GREEN

};

String name();

FontColor fontColor() default FontColor.RED;

}

文档化功能

Java提供的Documented元注释跟Javadoc的作用是差不多的,其实它存在的好处是开发人员可以定制Javadoc不支持的文档属性,并在开发中应用。它的使用跟前两个也是一样的,简单代码示例如下:

Java代码

1. //让它定制文档化功能

2. //使用此注解时必须设置RetentionPolicy为RUNTIME

3. @Documented

4. public @interface Greeting {

5.

6. //使用枚举类型

7. public enum FontColor{

8. BLUE,RED,GREEN

9. };

10. String name();

11. FontColor fontColor() default FontColor.RED;

12. }

//让它定制文档化功能

//使用此注解时必须设置RetentionPolicy为RUNTIME @Documented

public @interface Greeting {

//使用枚举类型

public enum FontColor{

BLUE,RED,GREEN

};

String name();

FontColor fontColor() default FontColor.RED;

}

标注继承

Java代码

1. //让它允许继承,可作用到子类

2. @Inherited

3. public @interface Greeting {

4.

5. //使用枚举类型

6. public enum FontColor{

7. BLUE,RED,GREEN

8. };

9. String name();

10. FontColor fontColor() default FontColor.RED;

11. }

//让它允许继承,可作用到子类

@Inherited

public @interface Greeting {

//使用枚举类型

public enum FontColor{

BLUE,RED,GREEN

};

String name();

FontColor fontColor() default FontColor.RED;

}

(4)读取注解信息

属于重点,在系统中用到注解权限时非常有用,可以精确控制权限的粒度

Java代码

1. package com.iwtxokhtd.annotation;

2. import https://www.360docs.net/doc/6314398757.html,ng.annotation.Annotation;

3. import https://www.360docs.net/doc/6314398757.html,ng.reflect.Method;

4.

5. //读取注解信息

6. public class ReadAnnotationInfoTest {

7. public static void main(String[] args)throws Exception {

8. //测试AnnotationTest类,得到此类的类对象

9. Class c=Class.forName("com.iwtxokhtd.annotation.AnnotationTest");

10. //获取该类所有声明的方法

11. Method []methods=c.getDeclaredMethods();

12. //声明注解集合

13. Annotation[] annotations;

14. //遍历所有的方法得到各方法上面的注解信息

15. for(Method method:methods){

16. //获取每个方法上面所声明的所有注解信息

17. annotations=method.getDeclaredAnnotations();

18. //再遍历所有的注解,打印其基本信息

19. for(Annotation an:annotations){

20. System.out.println("方法名为:"+method.getName()+" 其上面的注解为:"+an.annotationType().getSimpleName());

21. Method []meths=an.annotationType().getDeclaredMethods();

22. //遍历每个注解的所有变量

23. for(Method meth:meths){

24. System.out.println("注解的变量名为:"+meth.getName());

25. }

26.

27. }

28. }

29.

30. }

31.

32. }

package com.iwtxokhtd.annotation;

import https://www.360docs.net/doc/6314398757.html,ng.annotation.Annotation;

import https://www.360docs.net/doc/6314398757.html,ng.reflect.Method;

//读取注解信息

public class ReadAnnotationInfoTest {

public static void main(String[] args)throws Exception {

//测试AnnotationTest类,得到此类的类对象

Class c=Class.forName("com.iwtxokhtd.annotation.AnnotationTest");

//获取该类所有声明的方法

Method []methods=c.getDeclaredMethods();

//声明注解集合

Annotation[] annotations;

//遍历所有的方法得到各方法上面的注解信息

for(Method method:methods){

//获取每个方法上面所声明的所有注解信息

annotations=method.getDeclaredAnnotations();

//再遍历所有的注解,打印其基本信息

for(Annotation an:annotations){

System.out.println("方法名为:"+method.getName()+" 其上面的注解为:"+an.annotationType().getSimpleName());

Method []meths=an.annotationType().getDeclaredMethods();

//遍历每个注解的所有变量

for(Method meth:meths){

System.out.println("注解的变量名为:"+meth.getName());

}

}

}

}

}

webservice注解详解

webservice注解详解

javax.jws.WebService 当实现Web Service 时,@WebService 注释标记Java 类;实现Web Service 接口时,标记服务端点接口(SEI)。 要点: ? 实现Web Service 的Java 类必须指定@WebService 或@WebServiceProvider 注释。不能同时提供这两种注释。 此注释适用于客户机/服务器SEI 或JavaBeans 端点的服务器端点实现类。 ? 如果注释通过endpointInterface属性引用了某个SEI,那么还必须使用@WebService 注释来注释该SEI。 ? 请参阅适用于使用@WebService 注释的类的方法的规则,以了解更多信息 ?注释目标:类型 ?属性: - name wsdl:portType的名称。缺省值为Java 类或接口的非限定名称。(字符串)- targetNamespace 指定从Web Service 生成的WSDL 和XML 元素的XML 名称空间。缺省值为从包含该Web Service 的包名映射的名称空间。(字符串) - serviceName 指定Web Service 的服务名称:wsdl:service。缺省值为Java 类的简单名称 + Service。(字符串) - endpointInterface 指定用于定义服务的抽象Web Service 约定的服务端点接口的限定名。如果指定了此限定名,那么会使用该服务端点接口来确定抽象WSDL 约定。(字符串)- portName wsdl:portName。缺省值为https://www.360docs.net/doc/6314398757.html,+Port。(字符串)

Java注解

注解 可以先把注解当成注释来看,注释就是给类的各个组成部分(包、类名、构造器、属性、方法、方法参数,以及局部变量)添加一些解释。 可以先不去管注解是用来干什么的,就把它当成注释来看。注解的格式当然不能与注释相同,注解是需要声明的,声明注解与声明一个接口有些相似。当然Java也有一些内置注解,例如:@Override就是内置注解。 1声明注解 声明注解与声明一个接口相似,它需要使用@interface。一个注解默认为Annotation的 注解还可以带有成员,没有成员的注解叫做标记注解。成员的类型只能是基本类型、枚举类型)、String、基本类型数组、String[],以及注解和注解数组类型。 其中String表示成员的类型,value()表示成员名称。其中圆括号不能没有,也不能在圆

括号内放参数,它不是一个方法,只是一个成员变量。 注解可以有多个成员,但如果只有一个成员,那么成员名必须为value。这时在设置成

Java还提供了一些元注解,用来控制注解,例如@Retention和@Target: ●@Target:ElementType类型(枚举类型),表示当前注解可以标记什么东西,可选 值为: TYPE:可以标记类、接口、注解类、Enum。 FIELD:可以标记属性。 METHOD:可以标记就去。 PARAMETER:可以标记参数。 CONSTRUCTOR:可以标记构造器。 LOCAL_VARIABLE:可以标记局部变量。 ANNOTATION_TYPE:可以标记注解类声明。

PACKAGE:可以标记包。 ●@Retention:RetentionPolicy类型(枚举类型),表示注解的可保留期限。可选值为: SOURCE:只在源代码中存在,编译后的字节码文件中不保留注解信息。 CLASS:保留到字节码文件中,但类加载器不会加载注解信息到JVM。 RUNTIME:保留到字节码文件中,并在目标类被类加载器加载时,同时加载注解信息到JVM,可以通过反射来获取注解信息。 2访问注解 很多第三方程序或工具都使用了注解完成特殊的任务,例如Spring、Struts等。它们都提供了自己的注解类库。在程序运行时使用反射来获取注解信息。下面我们来使用反射来获取注解信息。

JAVA注解

JAVA注解 1、什么是注解 从JDK5开始提供名为Annotation(注释)的功能,它被定义为JSR-175规范。注释是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked")。注释可以附加在package, class, method, field 等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。如果没有外部解析工具等对其加以解析和处理的情况,本身不会对Java的源代码或class文件等产生任何影响,也不会对它们的执行产生任何影响。 2、JDK5内置的基本注释 JDK5内置了一些常用的注释,可以在编译时帮我们捕获部分编译错误,及提示信息,下面介绍下这些注释的用法: a、@Override定义在https://www.360docs.net/doc/6314398757.html,ng.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。例如我们为某类重写toString()方法却写成了tostring(),并且我们为该方法添加了@Override注释,在编译时,会提示错误:方法未覆盖其父类的方法。 b、@Deprecated定义在https://www.360docs.net/doc/6314398757.html,ng.Deprecated中,此注释可用于修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。 c、@SuppressWarnings定义在https://www.360docs.net/doc/6314398757.html,ng.SuppressWarnings中,用来抑制编译时的警告信息。与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数值都是已经定义好了的,我们选择性的使用就好了,如@SuppressWarnings(value = "unchecked")。 3、自定义注解 Annotation类型使用关键字@interface定义一个注解,Annotation 类型可以被它们自己所标注。Java5.0定义了4个标准的meta-annotation类型,分别是:Target、Retention、Documented、Inherited,它们被用来提供对其它annotation类型作说明。这些类型和它们所支持的类在https://www.360docs.net/doc/6314398757.html,ng.annotation包中可以找到。 @Target的用法:指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。 @Retention的用法:指示注释类型的注释要保留多久。如果注释类型声明中不存在Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。 @Documented的用法:指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分。Documented是一个没有成员的注释。 @Inherited的用法:指示注释类型自动被子类继承。 Inherited也是一个没有成员的注释。注意,如果使用@Inherited注释类以外的任何事物都是无效的。还要注意,此元注释仅对从超类继承注释有效;对已实现接口的注释无效。

java《注解解析》

Java注解(Annotation) (1) Annotation(注释)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注释是以‘@注释名’在代码中存在的,根据注释参数的个数,我们可以将注释分为:标记注释、单值注释、完整注释三类。它们都不会直接影响到程序的语义,只是作为注释(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。另外,你可以在编译时选择代码里的注释是否只存在于源代码级,或者它也能在class 文件中出现。 元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类: 编写文档:通过代码里标识的元数据生成文档。 代码分析:通过代码里标识的元数据对代码进行分析。 编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。 基本内置注释 @Override

Java代码 1. package com.iwtxokhtd.annotation; 2. /** 3. * 测试Override注解 4. * @author Administrator 5. * 6. */ 7. public class OverrideDemoTest { 8. 9. //@Override 10. public String tostring(){ 11. return "测试注释"; 12. } 13. } package com.iwtxokhtd.annotation; /** * 测试Override注解 * @author Administrator * */

java注释模板