- 浏览: 539623 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
c__海棠依旧:
很强,对于我这个新手很容易理解,准们登录来给你点赞的!
BeanFactory和FactoryBean -
hudazheng:
很清晰!
X86、X64和X86_64区别 -
hugh.wang:
...
BeanFactory和FactoryBean -
CB00J:
...
Executor框架和线程池 -
Arbow:
请教一个问题。现在互联网业务的数据库通常用分片方式来连接一组数 ...
BoneCP源码——概述
1、 什么是注解
Annotation表示一种注释的语法,在 Java 中最早提倡的是程序与配置相分离,而最新的理论是把所有配置直接写入到代码中,如果想完成这样的功能,则使用 Annotation 。
2、 系统内建的Annotation
2.1 @Override
重写父类的方法
2.2 @Deprecated
表示不建议使用的操作,如果使用该操作也不报错,只是在编辑器中出现横线警告信息,不建议使用。如Date 对像中的很多方法。
@ Deprecated
public int getDay () {
return normalize () .getDayOfWeek () - gcal.SUNDAY;
}
2.3 @SuppressWaring表示压制警告,如果出现警告信息,则可以压制不提示。 @SuppressWaring 的属性 String[] value() 为数组,说明可以同时压制多个警告。
@ Target ({ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE })
@ Retention ( RetentionPolicy.SOURCE )
public @interface SuppressWarnings {
String [] value () ;
}
3、自定义 Annotation
3.1 语法
public @interface 名称 {
}
3.2 定义 MyAnnotaion
package com.chenzehe.annotation;
public @interface MyAnnotation {
}
如果要使用此Annotation, 则使用 @ 符访问,不在同一个包中需要导入。如下面 Info 类的使用:
package com.chenzehe.annotation;
@MyAnnotation
public class Info {
}
3.3 Annotation的属性定义
Annotation的属性定义以 () 结尾。
package com.chenzehe.annotation;
public @interface MyAnnotation {
public String key () ;
public String value () ;
}
上面Annotation 定义了两个变量 key 和 value ,如果要使用此 Annotation ,则必须明确的给出其内容。如:
package com.chenzehe.annotation;
@MyAnnotation ( key= "name" ,value= "chenzehe" )
public class Info {
}
如果想给Annotation 的变量设置默认值,则使用 default 关键字完成,如:
package com.chenzehe.annotation;
public @interface MyAnnotation {
public String key () default "name" ;
public String value () default "chenzehe" ;
}
使用此Annotation 时,可以不用显示的设置变量值,而使用默认值。
3.4 Annotation中的属性值可以通过枚举限制
定义枚举类型Color:
package com.chenzehe.annotation;
public enum Color {
RED , GLREN , BLUE ;
}
在MyAnnotation 中定义一个 Color 类型的变量:
package com.chenzehe.annotation;
public @interface MyAnnotation {
public Color color () default Color. RED ;
}
则使用MyAnnotation 中的 color 变量时,值只能取 Color 中定义的类型:
package com.chenzehe.annotation;
@MyAnnotation ( color= "red" )
public class Info {
}
上面给变量color 赋值出错,正确如下:
package com.chenzehe.annotation;
@MyAnnotation ( color = Color. RED )
public class Info {
}
3.5 Annotation中的属性为数组类型
如果Annotation 中的属性为数组类型,则使用的时候必须按照数组的方式操作。
package com.chenzehe.annotation;
public @interface MyAnnotation {
public String [] urls () ;
}
使用:
package com.chenzehe.annotation;
@MyAnnotation ( urls = { "www.baidu.com" , "g.cn" })
public class Info {
}
4、 注释类型 Retention 和 枚举 RetentionPolicy
@Retention ( value = RUNTIME )
@Target ( value = ANNOTATION_TYPE )
public @interface Retention
指示注 解 类型的注释要保留多久 ,也就是作用范围。 如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS 。只有元注释类型直接用于注释时, Target 元注释才有效。如果元注释类型用作另一种注释类型的成员,则无效。
枚举 RetentionPolicy 定义了三种 Annotation的范围:
CLASS 在编译之后的 class文件中作用
RUNTIME 在运行的时候起作用
SOURCE 只在源代码中起作用
系统内置的三个Annotation 的作用域分别为:
@ Override : @Retention ( value = SOURCE ) 源码
@ Deprecated : @Retention ( value = RUNTIME ) 运行时
@ SuppressWarnings : @Retention ( value = SOURCE ) 源码
5、 反射与Annotation
一个Annotation 如果要想起作用,则肯定要依赖反射机制,通过反射可以取得一个方法上声明的 Annotation 全部内容。任何一下自定义的 Annotation 都是继承了 java.lang.annotation.Annotation 接口。
在 Field Method Constructor 的父类 AccessibleObject 定义了如下与Annotation 操作相关的方法:
取得全部Annotation : public Annotation [] getAnnotations ()
判断操作的是否是指定的Annotation : public boolean isAnnotationPresent ( Class <? extends Annotation > annotationClass)
例:下面Info 类中 toString() 方法使用的 Annotation ,在 Test 类中用反射访问这些 Annotation
package com.chenzehe.annotation;
public class Info {
@Override
@Deprecated
@SuppressWarnings ( value = "" )
public String toString () {
return "Hello World!" ;
}
}
package com.chenzehe.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class Test {
public static void main ( String [] args ) throws Exception {
Class<?> cls = Class. forName ( "com.chenzehe.annotation.Info" ) ;
Method method = cls.getMethod ( "toString" ) ;
Annotation [] annotations = method.getAnnotations () ;
for ( int i = 0; i < annotations. length ; i ++ ) {
System. out .println ( annotations [ i ]) ;
}
}
}
输出:@java.lang.Deprecated() ,而 Info 类中使用的三个 Annotation 中,只有 Deprecated 的范围为 runtime ,说明只有范围在 runtime 的才能被找到。
把MyAnnotation 类改成 runtime 范围,并在 Test 类中用反射取得他的属性:
package com.chenzehe.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention ( value = RetentionPolicy. RUNTIME )
public @interface MyAnnotation {
public String key () default "name" ;
public String value () ;
}
在 Info中使用该 Annotation :
package com.chenzehe.annotation;
public class Info {
@Override
@Deprecated
@SuppressWarnings ( value = "" )
@MyAnnotation ( value= "chenzehe" )
public String toString () {
return "Hello World!" ;
}
}
在 Test类中使用反射取得其属性:
package com.chenzehe.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class Test {
public static void main ( String [] args ) throws Exception {
Class<?> cls = Class. forName ( "com.chenzehe.annotation.Info" ) ;
Method method = cls.getMethod ( "toString" ) ;
Annotation [] annotations = method.getAnnotations () ;
for ( int i = 0; i < annotations. length ; i++ ) {
if ( method.isAnnotationPresent ( MyAnnotation . class )) {
MyAnnotation myAnnotation = method.getAnnotation ( MyAnnotation . class ) ;
String key = myAnnotation.key () ;
String value = myAnnotation.value () ;
System. out .println ( key + ":" + value ) ;
}
}
}
}
6、 Target
在java.lang.annotation 中已定义的注解类型 Target ,用于指定所定义的注解使用的范围为方法、类、属性等。
默认情况下一个自定义的Annotation 可以在任意地方使用,如自定义的 MyAnnotation ,如果没有指定 Target ,则可以在任意地方使用:
package com.chenzehe.annotation;
@MyAnnotation ()
public class Info {
@MyAnnotation ()
private String name ;
@MyAnnotation ()
public String toString () {
return "Hello World!" ;
}
}
在Target 的定义中, value 的属性类型为 ElementType [] ,所指定的范围有以下八种:
1、 只能在Annotation 中出现: ANNOTATION_TYPE
2、 只能在构造方法中出现: CONSTRUCTOR
3、 在属性中出现: FIELD
4、 只能在本地变量中出现: LOCAL_VARIABLE
5、 在方法上出现: METHOD
6、 在包声明中出现: PACKAGE
7、 在参数声明中出现: PARAMETER
8、 类、接口(包括注释类型)或枚举声明 中使用: TYPE
如以下自定义的MyAnnotation 只能在方法中使用:
package com.chenzehe.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention ( value = RetentionPolicy. RUNTIME )
@Target ( value= ( ElementType. METHOD ))
public @interface MyAnnotation {
public String key () default "name" ;
public String value () default "chenzehe" ;
}
Target中的属性 value 定义为数组类型,所以可以同时设置多个 ElementType ,如:
@Target ( value = { ElementType. METHOD , ElementType. FIELD })
7、 Document注解
在java.lang.annotation 中定义的注解类型 Documented , 指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分。
如声明 MyAnnotation注解:
package com.chenzehe.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;
@Documented
@Retention ( value = RetentionPolicy. RUNTIME )
@Target ( value = { ElementType. METHOD , ElementType. FIELD })
public @interface MyAnnotation {
public String key () default "name" ;
public String value () default "chenzehe" ;
}
在Info 类中使用:
package com.chenzehe.annotation;
public class Info {
/**
* 此方法是覆盖Object中的toString()方法
*/
@ MyAnnotation ()
public String toString () {
return "Hello World!" ;
}
}
可以通过eclipse 的 export 导出 javadoc ,在其注释中能看到上面编写的注释
8、 Inherited
在java.lang.annotation 中声明 Inherited ,表示该annotation 是否被该子类断承下去,如果没有此注解,说明不能被断承。
如自定义的MyAnnotation ,加入 @Inherited ,说明此 Annotation 可以被子类断承:
package com.chenzehe.annotation;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Inherited
@Retention ( value = RetentionPolicy. RUNTIME )
public @interface MyAnnotation {
public String key () default "name" ;
public String value () default "chenzehe" ;
}
在 Info类中使用该 Annotation :
package com.chenzehe.annotation;
@ MyAnnotation
public class Info {
}
创建Info 类的子类 PersonInfo :
package com.chenzehe.annotation;
public class PersonInfo extends Info {
}
使用反射取得PersonInfo 类的 annotation 信息:
package com.chenzehe.annotation;
import java.lang.annotation.Annotation;
public class Test {
public static void main ( String [] args ) throws Exception {
Class<?> cls = Class. forName ( "com.chenzehe.annotation.PersonInfo" ) ;
Annotation [] annotations = cls.getAnnotations () ;
for ( int i = 0; i < annotations. length ; i++ ) {
System. out .println ( annotations [ i ]) ;
}
}
}
如果MyAnnotation 中加入 @Inherited ,则可以取到 MyAnnotaion信息,如果没有加则取不到。
发表评论
-
Java异常机制Error类和Exception类
2015-01-23 20:39 0Error类和Exception类都继承自Throwabl ... -
RPC框架简单实现
2014-11-24 21:47 1498/* * Copyright 2011 A ... -
Java读取文件中单词进行排序并写到另一个文件中
2013-12-04 11:12 4764支持 http://ifeve.com/tao-code-m ... -
Java级联调用方法的类设计
2013-11-13 14:10 3227在Java方法设计时返回当前对象的引用(thi ... -
用反射解析jar文件并执行里面Java代码
2013-10-30 23:25 114971、使用JarFile类读取jar包MANIFEST.MF ... -
Hadoop IPC RPC类中对请求的客户端缓存类ClientCache问题
2013-09-24 19:52 2083Hadoop IPC RPC类中对请求的客 ... -
Java NIO 使用实例
2013-09-23 20:47 7089在JDK1.4之前,Java Output ... -
Java 远程接口调用 RMI
2013-09-06 12:00 0Java RMI 指的是远程方法调用 (Remo ... -
Comparable Comparator 的区别
2013-09-03 14:34 1261注:本文为转载 当需要排序的集合或数组不是单纯的数字型时 ... -
Java 枚举使用实例
2013-07-01 15:30 1985Lucene Field类中使用枚举如下: 声明抽象方法 ... -
Java集合框架 Map接口
2013-01-30 18:34 16361、HashMap HashMap是Map接口最常见的实 ... -
Java集合框架 Collection接口
2013-01-29 17:49 12141、ArrayList ArrayList是List接口 ... -
Java集合框架
2013-01-25 20:19 1188集合是Java中是最常用的包,最常见的有Colle ... -
携带结果的任务Callable和Future
2013-01-21 21:37 1709Executor框架使用Runnable作为基本的 ... -
线程池的使用
2013-01-17 18:23 1924线程池实现类ThreadPoolExecutor ... -
Executor框架和线程池
2013-01-15 21:08 6614简介 在JDK5后主 ... -
同步工具类之Exchanger
2013-01-11 17:11 1158Exchanger<V>,java.uti ... -
同步工具类之CyclicBarrier循环的barrier
2013-01-11 15:39 1466CyclicBarrier在java.util.c ... -
同步工具类之CountDownLatch倒数计数器
2013-01-10 20:59 3593CountDownLatch类在java.u ... -
同步工具类之Semaphore 信号量
2013-01-10 17:24 1590Semaphore可以维护 ...
相关推荐
java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解...
Java注解是Java编程语言中的一个重要特性,它允许在代码中添加元数据,为编译器、解释器或任何其他工具提供额外的信息。在Java Web服务(WebService)开发中,注解的应用极大地简化了服务的创建和配置。本文将深入...
java注解和反射的个人学习笔记
Java注解是Java编程语言中的一个重要特性,它提供了一种元数据的方式,允许程序员在代码中插入额外的信息,这些信息可以被编译器或者运行时环境用来执行特定的任务。注解在现代Java开发中扮演了不可或缺的角色,尤其...
Java注解是Java编程语言中的一个重要特性,它们提供了一种元数据的方式,允许程序员在代码中插入信息,这些信息可以被编译器或运行时环境用于处理代码。注解不仅简化了开发,还增强了代码的可读性和维护性。本资料...
### Eclipse Java注释模板知识点详解 #### 一、概述 在进行Java开发的过程中,良好的代码注释习惯不仅能帮助自己快速回顾代码逻辑,还能方便其他开发者理解代码意图,从而提高整个团队的工作效率。Eclipse作为一款...
Java注解是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,这些元数据可以被编译器或运行时环境用来执行各种任务,例如代码分析、验证、生成代码、部署等。注解提供了更加灵活和可扩展的方式来处理...
Eclipse作为一款强大的Java集成开发环境(IDE),提供了许多便捷的功能,其中之一就是“Eclipse Java 注释模板”。通过配置和使用这些模板,程序员可以快速地为代码添加注释,提高代码的可读性和维护性。下面我们将...
java 注释规范详解 java 注释规范是 Java 开发过程中不可或缺的一部分,它的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。java 注释规范可以分为三种:单行注释...
eclipse中java类注释模板,有需要的朋友可以参考使用。
Java注解技术是Java平台中一个非常重要的特性,它为元数据提供了强大的支持,使得开发者能够在代码中嵌入额外的信息,这些信息可以被编译器、JVM或第三方工具读取和处理。在本视频教程中,我们将深入探讨Java注解的...
Java 注释规范 Java 注释规范是为了让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。该规范定义了 Java 项目中注释的规范和要求,包括注释的类型、注释的内容、注释的位置...
Java注释是编程过程中的重要组成部分,它们不仅有助于提高代码的可读性和可维护性,还能为其他开发者提供代码的功能解释和使用指南。本篇全解文档深入探讨了Java注释的各种类型及其在不同框架中的应用,如Hibernate...
Java注解是自JDK1.5版本引入的一种元数据机制,它允许程序员在源代码的各个层次(类、方法、变量等)嵌入信息,这些信息可以被编译器或者运行时系统用来进行各种处理。注解简化了配置文件的使用,提高了代码的可读性...
### Java的注释 在Java开发中,良好的注释习惯对于提高代码的可读性和可维护性至关重要。本文将详细介绍几种常见的Java注释方式及其用途,并通过实例展示如何设置Eclipse IDE中的注释模板,帮助开发者更好地管理和...
Java代码注释是编程实践中非常重要的一个环节,它有助于提高代码的可读性和维护性。注释能够解释代码的功能、用途以及实现逻辑,使得其他开发者能更快地理解代码,尤其在团队协作中更是不可或缺。本资源"Java代码...
在Java编程中,注解(Annotation)是一种元数据,它提供了在代码中附加信息的方式,这些信息可以被编译器或运行时环境用来执行特定的任务。"Java使用注解拼接SQL语句"是一个常见的实践,它使得动态构建SQL查询变得...
Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是一种描述数据的数据,它提供了一种安全的方式,使我们可以在不改变程序代码本身的情况下,向编译器或运行时环境提供额外的...
Java注解是Java编程语言中的一个重要特性,它们提供了一种元数据的方式,让开发者能够向编译器或运行时环境传递额外的信息。这些信息可以用来验证代码、自动生成代码、配置框架或者在运行时进行一些处理。注解的使用...