您的位置:首页 > 编程语言 > Java开发

sphinx 中的注解,及java Annotation 总结

2015-06-29 21:35 344 查看
<span style="font-size:24px;">在sphinx中使用Annotation类型的目的 1
怎么自定义注释类型? 1
自定义注释的使用: 2
对sun通过的Documented,Retention ,Target ,Inherited的解释 3
注意 4
在sphinx中使用Annotation类型的目的
Annotation接口的annotationType()方法返回的是与此Annotation对应的Class类对象,通过通过getAnnotations()即可获得此annotation(注释)的上Annotation。
在sphinx4中为我们提供了一些(Annotation)注释用的类,如S4Double,S4String,S4ComponentList等,这些注释类在sphinx4源码中的使用都是在@S4Double(参数=某值),或者就是@S4Double的形式使用的。这些注释类在sphinx4中使用的主要目的是为sphinx4中的可配置类如前端处理,预加重等,以及其它类中设置默认属性用的,可以使我们不用在系统配置的XML文件中对某些组件(component)的属性进行配置即我们可以不用对某些属性进行配置而是实行sphinx4为我们提供的默认配置。例如在LogMath类中使用了@S4Double(defaultValue = 1.0001)  public final static String PROP_LOG_BASE = "logBase";,来为LogMath的logbase设置其默认值为1.0001。
注意,默认设置的完成是依赖与发射机制的。Sphinx4正是对注释类的进行反射来设置默认值的。
以下为java-sun的Annotation(注释)有关的总结内容:
Java-sun提供了一个Annotation接口,任何的Annotation类型都默认实现了该接口。就像所有的对象都默认继承于Object类一样。Java-sun为我们提供了四个注型  Documented, Inherited,
Retention ,Target。最四个注释类型用于对自定义的注释类型的特性(特征)的说明,如注释类型存在的时间,存在的位置,是否可以插入文件注释等。
怎么自定义注释类型?
自定义注释类型的书写为public @interface name{final field;attribute;},自定义注释类型,final field,和attribute的个数是可选的,可以为0,也可以大于0;field是必须按照被初始化的,attribute后必须加()即括号,括号内不能有任何东西。Attribute是可以被初始化得,其初始化是通过在括号后加default, 在default后加初始值。不管是field还是attribute被有类型定义

下面是自定义的例子:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@S4Property
public @interface S4Double {
public static final double NOT_DEFINED = -918273645.12345; // final field
double defaultValue() default NOT_DEFINED; //attribute
double[] range() default {-Double.MAX_VALUE, Double.MAX_VALUE};//attribute
boolean mandatory() default true;// //attribute
Class<? extends Configurable> type();
}
例1
public @interface S4Double {
public static final double NOT_DEFINED = -918273645.12345;  // final field
double defaultValue()  //attribute
}
例2
public @interface S4Double {
public static final double NOT_DEFINED = -918273645.12345;  // final field
double define=100000;
}
例3
public @interface S4Double {
double getvalue();
double  defaultValue() default 10000;
}
例4
以上为自定义注释的定义。
自定义注释的使用:
首先须注意自定义注释上面的那些对注释,那些注释声明了自定义注释的特征和特性,限制。我们使用自定义注释时需按照其特性来使用。如有些其上面的注释规定了自定义注释只能用于方法或类上,那我们只能在方法或类上使用。
对注释的使用,一般是需要注释的地方上方用:@后紧跟着注释名。使用注释不是已;结束的,其后是不需加;的。注意注释名后可加(),括号内可对注释的attribute进行赋值,attribute的个数可以是多个,多个之间用,分隔。
以下是使用实例:
@S4Double            @S4Double(defaultValue=10, getvalue=100)
某方法或类或其它          某方法
注意对于那些有attribute但是没有初始化的自定义注释,在使用时需对其attribute进行赋值使用,即必须加括号,并在其内进行赋值。
注意:最保守的定义注释的方法是,对于其中的attribute都进行初始化,即加 default 值。
对sun通过的Documented,Retention ,Target ,Inherited的解释
A,	Documented:注释类型是用来说明自定义注释的,它是说可以在文档化的意思。 可以在其自定义注释上方进行文档注释即/** 内容*/ ,//内容  。当我们对代码进行生成文档后,所加的文档注释的内容将会出现在自定义注释所注释的元素生成的文档内,于一般的文档注释不同。
B,	Retention:指示自定义注释类型的注释要保留多久。如果自定义注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。Retention有一个attribute为:
RetentionPolicy value 其中RetentionPolicy为类型说明,value为attribute名。我们可以在使用的时候对value进行赋值,来改变其保留多久,但是赋的值只是RetentionPolicy类型,RetentionPolicy是枚举类,所以只能赋值只能在下面三个中取:
1 ,RetentionPolicy. CLASS   表示编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
2,RetentionPolicy. RUNTIME  表示编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
3,RetentionPolicy.SOURCE  表示编译器要丢弃的注释。

C,	Target:指自定义注释类型能注释(说明)元素(紧挨使用注释下的方法或类或属性或注释…等)的种类。如果自定义注释类型声明上不存在 Target 注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。
Target包含一个attribute为ElementType[] value(),使用时需对其赋值,赋的值为ElementType[]
ElementType为枚举类型,由于是数组,赋的值必须为最少为以下的一个:
1,ElementType.TYPE    表示类、接口(包括注释类型)或枚举声明
2,ElementType.FIELD     表示字段声明(包括枚举常量)
3,ElementType.PARAMETER   表示参数声明
4,ElementType .CONSTRUCTOR    表示构造方法声明
5,ElementType.LOCAL_VARIABLE  表示局部变量声明
6,ElementType.ANNOTATION_TYPE  表示注释类型声明
7,ElementType.PACKAGE          表示包声明
8, ElementType.METHOD            表示方法声明

D, Inherited:表示在类中所使用的自定义注释能够被,其子类所继承下来。(指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了该类层次结构的顶层 (Object) 为止。如果没有超类具有该类型的注释,则查询将指示当前类没有这样的注释。注意,如果使用注释类型注释类以外的任何事物,此元注释类型都是无效的。还要注意,此元注释仅促成从超类继承注释;对已实现接口的注释无效。)
注意
1,自定义注释是可以紧跟着它所要注释(说明)的元素的,不一定要分行,如果自定义注释加了括号的话,那么在注释的元素和自定义注释之间可以不用隔开,不然就必须隔开。并且自定义注释是可以用在方法的括号内的。自定义注释所注释(说明)的是和它紧挨的元素,中间可有空格,tab键等特殊的。
2,如果自定义注释的定义中只有一个枚举相关的attribute,即attribute的类型为枚举或枚举数组等于枚举相关的,那么在使用时在括号内可以直接使用你想要的赋值,可以不需attribute=所赋值的形式。如@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
3,如果自定义的注释内含有数组类型的attribute,那么不能确定数组的长度。否则出错。

</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息