Annotation

Ø  RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
注解是可以在运行期做反射,改变程序逻辑使用
**************************************************************
1.  了解注解
我们有必要对JDK 5.0新增的注解(Annotation)技术进行简单的学习,因为Spring 支持@AspectJ,而@AspectJ本身就是基于JDK 5.0的注解技术。所以学习JDK 5.0的注解知识有助于我们更好地理解和掌握Spring的AOP技术。
对于 java开 发人员来说,在编写代码时,除了源程序以外,我们还会使用Javadoc标签对类、方法或成员变量进行注释,以便使用Javadoc工具生成和源代码配套 的Javadoc文档。这些@param、@return等Javadoc标签就是注解标签,它们为第三方工具提供了描述程序代码的注释信息。使用过 Xdoclet的朋友,对此将更有感触,像Struts、Hibernate都提供了Xdoclet标签,使用它们可以快速地生成对应程序代码的配置文 件。
JDK5.0注解可以看成是Javadoc标签和Xdoclet标签的延伸和发展。在JDK5.0中,我们可以自定义这些标签, 并通过Java语言的反射机制中获取类中标注的注解,完成特定的功能
注解是代码的附属信息, 它遵循一个基本原则:注解不能直接干扰程序代码的运行,无论增加或删除注解,代码都能够正常运行。Java语言解释器会忽略这些注 解,而由第三方工具负责对注解进行处理。第三方工具可以利用代码中的注解间接控制程序代码的运行,它们通过Java反射机制读取注解的信息,并根据这些信 息更改目标程序的逻辑,而这正是Spring AOP对@AspectJ提供支持所采取的方法。
注解的语法比较简单,除了@符号的使用以外,它基本上与java的固有语法一致,java内置了三种注解,定义在java.lang包中。
@Override: 只能用在方法之上的 ,用来告诉别人这一个方法是改写父类的。
@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上。
@ SuppressWarnings:表示关闭一些不当的编译器警告信息。

2.  定义注解
下面是一个定义注解的实例。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Description {
 
 String value();
}
其中的 @interface是一个关键字,在设计annotations的时候必须把一个类型定义为@interface,而不能用class或 interface关键字。 所有的注解类都隐式继承于java.lang.annotation.Annotation,注解不允许显式继承于其他的接 口。

一个注解可以拥有多个成员,成员声明和接口方法声明类似,这里,我们仅定义了一个成员,成员的声明有以下几点限制:
a)    成员以无入参无抛出异常的方式声明,如boolean value(String str)、boolean value() throws Exception等方式是非法的;
b)    可以通过default为成员指定一个默认值,如String level() default "LOW_LEVEL"、int high() default 2是合法的, 当然也可以不指定默认值;
c)    成员类型是受限的,合法的类型包括原始类型及其封装类、String、Class、enums、注解类型,以及上述类型的数组类型。如ForumService value()、List foo()是非法的。
d)   如果注解只有一个成员,则成员名必须取名为value(), 在使用时可以忽略成员名和赋值号(=),如@Description("使用注解的实例")。 注解类拥有多个成员时,如果仅对value成员进行赋值则也可不使用赋值号,如果 同时对多个成员进行赋值,则必须使用赋值号,如 @DeclareParents (value = "NaiveWaiter", defaultImpl = SmartSeller.class)。
e)   注解类可以没有成员,没有成员的注解称为 标识注解,解释程序以标识注解存在与否进行相应的处理;

注解定义包含四个元注解,分别为@Target,@Retention,@Documented,@Inherited。各元注解的作用如下:
1)  @Target
表示该注解用于什么地方,可能的 ElemenetType 参数包括:
Ø  ElemenetType.CONSTRUCTOR 构造器声明。
Ø  ElemenetType.FIELD 域声明(包括 enum 实例)。
Ø  ElemenetType.LOCAL_VARIABLE 局部变量声明。
Ø  ElemenetType.METHOD 方法声明。
Ø  ElemenetType.PACKAGE 包声明。
Ø  ElemenetType.PARAMETER 参数声明。
Ø  ElemenetType.TYPE 类,接口(包括注解类型)或enum声明。
2)  @Retention
表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
Ø  RetentionPolicy.SOURCE 注解将被编译器丢弃。
Ø  RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃。
Ø  RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
举一个例子,如@Override里面的Retention设为SOURCE,编译成功了就不要这一些检查的信息,相反,@Deprecated里面的 Retention设为RUNTIME,表示除了在编译时会警告我们使用了哪个被Deprecated的方法,在执行的时候也可以查出该方法是否被 Deprecated。
3)  @Documented
将此注解包含在 javadoc 中
4)  @Inherited
允许子类继承父类中的注解

3.  使用注解
下面是一个使用注解注解的实例。
 
@Description(value="使用注解的实例")
public class TestAnnotation {
}
使用注解的语法:@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,...)
如果成员是数组类型,可以通过{}进行赋值,如boolean数组的成员可以设置为{true,false,true}。下面是几个注解标注的例子:
1)   多成员的注解
@AnnoExample(id= 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody")
2)   一个成员的注解,成员名为value
可以省略成员名和赋值符号:@Copyright("Right Reserved")
@Copyright("2011 bookegou.com All Right Reserved")
3)   无成员的注解
@Override
@Override
4)   成员为字符串数组的注解
@SuppressWarnings(value={"unchecked","fallthrough"})
@SuppressWarnings(value={"unchecked","fallthrough"})
5)   成员为注解数组类型的注解
@Reviews({@Review(grade=Review.Grade.EXCELLENT,reviewer="df"),
@Review(grade=Review.Grade.UNSATISFACTORY,reviewer="eg",
comment="This method needs an @Override annotation")})
@Reviews({@Review(grade=Review.Grade.EXCELLENT,reviewer="df"),    
           @Review(grade=Review.Grade.UNSATISFACTORY,reviewer="eg",            
                    comment="This method needs an @Override annotation")})
@Reviews注解拥有一个@Review注解数组类型的成员,@Review注解类型有三个成员,其中reviewer、comment都是String类型,但comment有默认值,grade是枚举类型的成员。

4.  解析注解
下面是一个解析注解的实例。
public class ParseAnnotation {
 
 public static void main(String[] args) throws Exception{
  final Class cls = Class.forName("com.annotation.TestAnnotation");
  final Method[] method = cls.getMethods();
 
  // 判断是否有指定注解类型的注解
  if(cls.isAnnotationPresent(Description.class)) {
   // 根据注解类型返回指定类型的注解
   Description des = (Description)cls.getAnnotation(Description.class);
   System.out.println("注解描述:" + des.value());
  }
 }
}
输出结果如下:
 注解描述:使用注解的实例
 
前面提到过,注解不会直接影响程序的运行,但是第三方程序或工具可以利用代码中的注解完成特殊的任务,间接控制程序的运行。对于RetentionPolicy.RUNTIME保留期限的注解,我们可以通过反射机制访问类中的注解。
在JDK5.0里,Package、Class、Constructor、Method以及Field等反射对象都新增了访问注解信息的方法:<T extends Annotation>T getAnnotation(Class<T> annotationClass),该方法支持通过泛型直接返回注解对象。   
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OxyPlot Annotation是一个在OxyPlot库功能强大的注释工具。注释是在图表上添加额外信息以增强数据可视化的一种方式。 使用OxyPlot Annotation,我们可以在图表上添加文本、线条、箭头、圆形等注释元素。这些注释元素可以帮助我们更好地描述和解释图表的数据。 例如,我们可以使用注释添加一个标题来说明该图表的主题或目的。我们可以选择注释的位置、字体、大小和颜色等样式,以及背景色和边框等外观效果。 除了文本注释,我们还可以使用注释绘制线条,比如表示趋势线或连接两个数据点之间的关系。线条注释有许多样式和参数可以定制,例如线的颜色、线宽、线型和箭头的形状等。 另外,我们还可以使用注释绘制圆形或矩形等形状。这些形状可以用来突出显示某个数据点或数据区域,或者用来标记某个特殊事件发生的位置。 总之,OxyPlot Annotation提供了丰富的注释功能,使我们能够更好地展示和解释数据。通过使用不同的注释元素和样式,我们可以设计出具有吸引力和易读性的图表,帮助用户更好地理解和分析数据。 ### 回答2: OxyPlot Annotation是一个功能强大的注释工具,可以在OxyPlot图表添加文本、箭头、线条等。它提供了一种方便的方式来标记和注释图表上的特定区域或数据点。 通过OxyPlot Annotation,用户可以在图表添加静态或动态的注释,以便更好地理解数据的含义。这些注释可以用于指示特定数据点或趋势、说明数据变化的原因、提示特定事件的发生等。 使用OxyPlot Annotation,用户可以自定义注释的外观和位置。例如,可以调整文本的颜色、字体、大小和对齐方式;可以设置箭头的样式、宽度和长度;可以绘制自定义的线条并将其连接到图表上的任何位置。 除了静态注释,OxyPlot Annotation还支持动态注释。用户可以根据特定的事件或条件,在图表上动态地添加、更新或删除注释。这使得用户可以根据数据的变化自动更新注释,以便更好地呈现动态或实时的数据。 总之,OxyPlot Annotation是一个非常实用的工具,能够让用户在OxyPlot图表添加各种注释,以便更好地理解和展示数据。无论是在科学研究、数据可视化、教育培训还是其他领域,OxyPlot Annotation都能为用户提供强大而灵活的注释功能。 ### 回答3: OxyPlot是一个用于绘制图形和图表的开源.NET绘图库。Annotation(注释)是OxyPlot的一个重要功能,用于向绘图添加额外的注释信息,以便更好地展示数据。 OxyPlotAnnotation提供了多种类型的注释,包括文本注释、线条注释、矩形注释、椭圆注释等。通过调整注释的位置、大小、颜色、字体等属性,我们可以将注释放置在适当的位置,并与图形数据进行关联。 首先,我们可以使用文本注释来添加带有说明或说明的文字。通过指定文字的位置、大小、颜色等属性,我们可以将文字注释放置在图形的特定位置,并使其与相应的数据点相关联。 其次,线条注释可以用于在图形添加直线或曲线。通过指定线条的起始点和终点,以及颜色、宽度等属性,我们可以将线条注释放置在图形,并以可视化方式突出显示数据之间的关联。 矩形注释和椭圆注释可以用于在图形创建一个矩形或椭圆形区域。通过指定其位置、大小、颜色等属性,我们可以将矩形或椭圆注释放置在图形的指定区域,并突出显示该区域的特定数据。 综上所述,OxyPlotAnnotation提供了丰富的注释功能,能够帮助我们更好地理解和分析绘图数据。通过使用不同类型的注释对象,并设置其属性,我们可以轻松地将注释添加到图表,并使其与相应的数据点或数据区域相关联。这样,我们就能够更直观地呈现数据,并更好地传达数据的含义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值