Java Annotation

 

Java SE 5.0 开始引入Annotation(标记)新语法特性。Annotation用于修饰包、类型(类、接口、enum)、方法、属性、变量、参数等,为上述被修饰的对象提供metadata。Annotation本身是一种接口(inerface)类型。

作为Annotation的一个应用实例,Servlet 3.0规范中定义了 @WebServlet Annotation,用于取代web.xml 描述文件中的<servlet>和<servlet-mapping>。例如,以下的Servlet声明

复制代码
<servlet>
    <display-name>...</display-name>
    <servlet-name>...</servlet-name>
    <servlet-class>your.ServletClass</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>...</servlet-name>
    <url-pattern>/mapping/url</url-pattern>
</servlet-mapping>
复制代码

可使用@WebServlet 在源代码中直接进行声明,如下:

package your;

...

@WebServlet(name="...", displayName="...", urlPatterns = {"/mapping/url"}, loadOnStartup=1)
public class ServletClass extends HttpServlet {
    ...

 

1,Annotation 的定义

Annotation的定义类似于接口的定义,但有以下不同/限制:

  • interface关键字必须加@前缀,即 @interface
  • 方法不得有参数和throws
  • 方法返回值类型为以下之一:基本数据类型、String、Class、enum、Annotation,以及这些类型的数组
  • 方法可以有默认值,用 default 关键字声明
  • 如果只有一个方法,方法名必须为value

Annotation的方法称为element。下面是一个示例Annotation的定义:

复制代码
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
/** * This annotation should be used only on methods. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface DemoMethodAnnotation {
int anIntElement();
String aStringElement();
String anotherStringElement() default "whatever";
String aArrayOfStringsElement();
}
复制代码

上面的例子中,Annotation的定义本身也应用了2个Annotation:@Retention和@Target。关于这2个Annotation及其element,可参考它们的 API Doc。

 

2,Annotation的使用

Annotation是作为修饰符使用的,因此,基本上,其他修饰符(如public、static、final...)可使用的地方就可以使用Annotation。Annotation的一般声明格式为:

@AnnotationName(elementName1=value1, elementName2=value2, ...)

但有如下的限制或特例:

  • element 值必须是编译时的常量
  • 定义为具有默认值的element可省略,将使用其默认值
  • 空element列表(())可省略,即只声明 @AnnotationName 
  • 如果仅有一个element(其名称为value),可省略value=,即 @AnnotationName(theValue)

 

3,通过反射在运行时读取Annotation信息

通过以下API读取Annotation信息:

  • 接口 java.lang.reflect.AnnotatedElement,此接口的实现类有Package、Class、Method、Constructor、Field等(你懂的)

 

 

posted @   Jack of Hearts  阅读(514)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示