annotation(注解)并不直接影响代码语义,但是它能够工作的方式被看作类似程序的工具或者类库,它会反过来对正在运行的程序语义有所影响。annotation可以从源文件、class文件或者以在运行时反射的多种方式被读取。
JDK5内建的annotation 有@Override @Deprecated @SuppressWarnings
@Override 当子类重写父类的方法时,在子类的方法上面加上此注释,可以检查重写的方法是否正确。
@Deprecated 标示此方法已经过时。
@SuppressWarnings 将警告忽略。@SuppressWarnings({"unchecked","deprecation"})
例如:Map map = new Map();会出现警告,应为没有应用泛型,
正确的为Map<?,?> map = new Map<?,?>();此方法前加上@SuppressWarnings("unchecked")警告会消失。
自定义annotation
使用@interface自行定义Annotation型态时,实际上是自动继承了java.lang.annotation.Annotation接口
由编译程序自动为您完成其它产生的细节
1、创建一个自定义的annotation名为MyAnnotation
public @interface MyAnnotation
{
String hello() default "wangjie";
String world();
}
annotation 方法中默认为 String value(); 如果为默认属性时,可以使用@MyAnnotation("XXX") 否则得使用@MyAnnotation(hello="XXX",world="XXX") .hello的值将覆盖default中的值"wangjie".另外hello()有默认值所以@MyAnnotation(world="XXX")也是正确的。
2、创建一个测试类
//annotation 可以放在类、方法、属性前面。
@MyAnnotation(hello = "beijing", world = "shanghai")
public class MyTest
{
@MyAnnotation(hello = "beijing", world = "shanghai")
public void output()
{
System.out.println("output something");
}
}
2.1 这样就完成了注释的编写。注释会在程序代码、编译、运行时都会保留吗?这还需要自己来设定。
java.lang.annotation.Retention型态可以在您定义Annotation型态时,指示编译程序该如何对待您的自定义的 Annotation型态
预设上编译程序会将Annotation信息留在.class档案中,但不被虚拟机读取,而仅用于编译程序或工具程序运行时提供信息
在使用Retention型态时,需要提供java.lang.annotation.RetentionPolicy的枚举型态
package java.lang.annotation;
public enum RetentionPolicy
{
SOURCE, //编译程序处理完Annotation信息后就完成任务
CLASS, //编译程序将Annotation储存于class档中,缺省
RUNTIME //编译程序将Annotation储存于class檔中,可由VM读入
}
所以要指示annotation可以保留在何种方式中,需要用到:@Retention(XXX) xxx为RetentionPolicy.RUNTIME 或
RetentionPolicy.SOURCE 默认为RetentionPolicy.CLASS
例如将上面可以MyAnnotation修改为
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
String hello() default "wangjie";
String world();
}
这样在程序运行时就可以调用MyAnnotation 中的值了。调用采用反射。
例如:
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class MyReflection
{
public static void main(String[] args) throws Exception
{
MyTest myTest = new MyTest();
Class<MyTest> c = MyTest.class;
Method method = c.getMethod("output",new Class[]{});
if(method.isAnnotationPresent(MyAnnotation.class))
{
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
String hello = myAnnotation.hello();
String world = myAnnotation.world();
System.out.println(hello);
System.out.println(world);
}
//打印出方法上面所使用的所以annotation的类型名称。
Annotation[] annotations = method.getAnnotations();
for(Annotation annotation : annotations)
{
System.out.println(annotation.annotationType().getName());
}
}
}
结果为:
beijing
shanghai
com.langsin.annotation.MyAnnotation
2.2 如果要限定annotation放置的位置 可以使用@Target()
例如
@Target(ElementType.METHOD) //这里加入了,则表示MyAnnotation只能放在方法的前面。
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
String hello() default "langsin";
String world();
}
Target的参数有:
package java.lang.annotation;
public enum ElementType
{
TYPE, //适用class, interface, enum
FIELD, //适用field
METHOD, //适用method
PARAMETER, //适用method上之parameter
CONSTRUCTOR, //适用constructor
LOCAL_VARIABLE, //适用局部变量
ANNOTATION_TYPE, //适用annotation型态
PACKAGE //适用package
}
2.3 如果一个父类加入了@MyAnnotation() 他的子类也想继承父类的这个注释。则在MyAnnotation中需要加入@Inherited() 这样在子类中才能得到这个注释的内容。(运用反射)。
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnotation
{
String hello() default "wangjie";
String world();
}
2.4 想要在使用者制作JavaDoc文件的同时,也一并将Annotation的讯息加入至API文件中
使用java.lang.annotation.Documented
即在annotation 前加入@Documented
例如:
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation
{
String hello() default "wangjie";
String world();
}
分享到:
相关推荐
### Spring框架中的Annotation注解详解 #### 一、Spring与Annotation的基本概念 Spring框架通过引入Annotation,极大地简化了Java开发中的依赖注入(Dependency Injection, DI)和面向切面编程(AOP)的过程。...
【标签】:Hibernate, Annotation, 笔记, 总结, 注解 【正文】: Hibernate Annotation是Hibernate框架的一个重要特性,它允许开发者直接在Java类上使用注解来定义对象的数据库映射,从而避免了传统的XML配置文件...
### Annotation注解的深入解析与应用 #### 一、Annotation概览 ##### 1.1 何为元数据 元数据,在计算机科学中,是指用于描述数据的数据,它提供了关于数据本身的附加信息,有助于理解、解释和管理数据。在编程...
Java Annotation注解技术是自Java SE 5.0版本引入的一种元编程机制,它允许程序员在源代码的各个层面(如类、方法、变量等)添加元数据,以供编译器、JVM或第三方工具在编译时或运行时进行处理。Annotation简化了...
总结,Java 1.5引入的注解机制为编程带来了很多便利,使得代码更加清晰,同时也降低了维护成本。通过深入理解注解的工作原理和使用方式,开发者可以更好地利用这一特性,提高代码质量和效率。而源代码分析则有助于...
总结起来,自定义Annotation注解是Java中强大的工具,它允许程序员以声明式方式添加元数据,从而简化代码和提高可维护性。`CustomAnnotationDemo`是一个基础示例,展示了如何定义、使用和处理自定义注解,对于理解这...
本篇文章将聚焦于MyBatis中的注解(Annotation)与XML配置的结合使用,旨在帮助开发者更深入地理解这一关键特性。 首先,MyBatis允许我们使用注解来简化Mapper接口的定义,无需编写XML映射文件。例如,我们可以在...
在Java编程语言中,注解(Annotation)是一种元数据,它提供了向编译器、工具或运行时系统提供额外信息的方式。自定义注解允许开发者创建自己的标记来满足特定需求,比如代码生成、验证、持久化等。本文将深入探讨...
总结起来,Annotation是Java语言的一个强大特性,它提供了一种安全、灵活的方式来添加和利用元数据。通过结合编译器、IDE和其他工具,Annotation可以显著提高开发效率,增强代码质量,简化维护,并推动代码的自动化...
总结起来,`annotation`是Java中一种强大的工具,它可以用于代码的元数据声明,为编译器和运行时环境提供了丰富的信息。通过自定义注解和对应的处理机制,我们可以实现代码的自动化处理、验证、配置等高级功能。在...
在Java中,Annotation表现为一种“name=value”结构的声明,它们通常用于提供额外的元信息,比如代码的注解、编译时检查或运行时的处理。 Annotation的定义分为以下几个关键点: 1. **Annotation的概念**:...
### 总结 全注解配置方式大大简化了SSH项目的配置过程,使代码更加简洁明了,易于理解和维护。通过上述介绍,我们了解了如何在Struts2、Spring和Hibernate中利用注解来替代传统的XML配置文件,从而实现无配置架构。...
总结来说,这个 "Spring Hibernate Annotation demo" 展示了如何在 Spring 框架中使用注解配置来管理依赖,以及如何利用 Hibernate 的注解进行数据持久化。同时,它还涉及到了 Flex 前端与后端的交互。通过学习这个 ...
在Android开发中,注解(Annotation)是一种元数据,它提供了在代码中附加信息的方式,这些信息可以被编译器或者运行时环境用来执行特定的操作。注解在Java语言中引入,随后被广泛应用于Android系统,帮助开发者实现...
总结起来,`javax.annotation.zip`这个压缩包中的`javax.annotation-api-1.3.2.jar`是Java开发中处理注解的关键库,特别是对于依赖注入和IoC场景,如使用`@Resource`注解进行Bean装配。如果在项目中遇到`@Resource`...
总结,注解在Java开发中扮演了不可或缺的角色,它们简化了代码维护,提供了元数据的声明,并允许自定义编译时和运行时的行为。通过深入理解并熟练运用注解,可以提高代码的可读性、可维护性和可扩展性。
总结,Java注解是一种强大的工具,能够简化代码,提供元数据,增强代码的可读性和可维护性。结合反射机制,我们可以利用注解实现许多灵活的编程模式,如自动化配置、动态代理等。了解并熟练运用注解,是提升Java开发...
Hibernate Annotation是Hibernate框架的一个扩展,它允许开发者直接在Java类和属性上使用注解(Annotations),来定义实体类与数据库表之间的映射关系。相比于XML配置,注解提供了一种更加内聚和直接的方式,使得...