- 浏览: 532659 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 1440/* * Copyright 2011 A ... -
Java读取文件中单词进行排序并写到另一个文件中
2013-12-04 11:12 4707支持 http://ifeve.com/tao-code-m ... -
Java级联调用方法的类设计
2013-11-13 14:10 3171在Java方法设计时返回当前对象的引用(thi ... -
用反射解析jar文件并执行里面Java代码
2013-10-30 23:25 114201、使用JarFile类读取jar包MANIFEST.MF ... -
Hadoop IPC RPC类中对请求的客户端缓存类ClientCache问题
2013-09-24 19:52 2025Hadoop IPC RPC类中对请求的客 ... -
Java NIO 使用实例
2013-09-23 20:47 7038在JDK1.4之前,Java Output ... -
Java 远程接口调用 RMI
2013-09-06 12:00 0Java RMI 指的是远程方法调用 (Remo ... -
Comparable Comparator 的区别
2013-09-03 14:34 1209注:本文为转载 当需要排序的集合或数组不是单纯的数字型时 ... -
Java 枚举使用实例
2013-07-01 15:30 1931Lucene Field类中使用枚举如下: 声明抽象方法 ... -
Java集合框架 Map接口
2013-01-30 18:34 15881、HashMap HashMap是Map接口最常见的实 ... -
Java集合框架 Collection接口
2013-01-29 17:49 11661、ArrayList ArrayList是List接口 ... -
Java集合框架
2013-01-25 20:19 1115集合是Java中是最常用的包,最常见的有Colle ... -
携带结果的任务Callable和Future
2013-01-21 21:37 1667Executor框架使用Runnable作为基本的 ... -
线程池的使用
2013-01-17 18:23 1875线程池实现类ThreadPoolExecutor ... -
Executor框架和线程池
2013-01-15 21:08 6560简介 在JDK5后主 ... -
同步工具类之Exchanger
2013-01-11 17:11 1110Exchanger<V>,java.uti ... -
同步工具类之CyclicBarrier循环的barrier
2013-01-11 15:39 1414CyclicBarrier在java.util.c ... -
同步工具类之CountDownLatch倒数计数器
2013-01-10 20:59 3506CountDownLatch类在java.u ... -
同步工具类之Semaphore 信号量
2013-01-10 17:24 1546Semaphore可以维护 ...
相关推荐
java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解...
java注解和反射的个人学习笔记
eclipse中java类注释模板,有需要的朋友可以参考使用。
JAVA注释模板以及详细设置解释等等。 注释模板 如何设置
Java注解实现
超级好用的 java 注释模板,吐血总结,整理。吐血总结,整理。
主要包括:普通java注解,hibernate注解,spring注解,struts2注解,对于学习注解的朋友有很大的帮助!
java 注释模板 java 注释模板 java 注释模板 java 注释模板java 注释模板java 注释模板java 注释模板java 注释模板java 注释模板java 注释模板java 注释模板java 注释模板java 注释模板java 注释模板java 注释模板
java注释全解,内容全面,包括hibernate注解、Java注解、Spring注解、SSH全注解等内容,分为4个文档介绍。另附一些精品java学习资料,欢迎大家下载学习。
入门级java 注解学习示例代码
Eclipse Java 注释模板,设置后可以使用快捷键快速生成文档注释,版本信息等。
如果你想知道java annotation是什么?你可以看看
简述java注解功能及用法,有代码示例。看起来还成,比较简单,学spring注入的时候要用到注解注入的话,本书属于必看版。
Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解
Java代码注释率检查器
自己做得java项目注释统计工具,可统计代码行数,注释行数,能统计各种注释样式,能看统计详细情况,能生成报表,可自由控制合格率!算法高效!
java 通过反射获取类上注解,方法上注解,注解里的值及方法参数,项目为maven项目。导入时记得选择maven项目
Java注释的良好习惯,方便项目的交接和事后的维护与整理,是一个很好的帮助自己养成编码习惯的工具,效果图在我的博文有记录,有需要的伙伴可以自行下载哦~
有关于java的注释规范的详细描述,单行注释、多行注释、分块注释等这些java的三种注释方式
java注解解析知识要点 精简易懂