本集主要讲述@Retention及@Target2个注解,顺带提一下@Documented这个注解
1.关于@Retention这个注解
Retention翻译成中文是“保留”的意思,RetentionPolicy是“保留策略”。
简要描述:指示注解类型的注解要保留多久。如果注解类型声明中不存在 Retention 注解,则保留策略默认为 RetentionPolicy.CLASS。
每一个Retention都要给他一个RetentionType,RetentionType是一个枚举类型(具体可以查看API文档),它有3种取值:SOURCE,CLASS,RUNTIME,区别如下:
(a)SOURCE:表示该注解只会存在于JAVA源文件中,不会编译到class文件里面去,更不会在运行期通过反射的方式获 取到。
(b)CLASS:表示该注解会随着JAVA源代码一起编译到class文件里面去,但不会在运行期通过反射的方式获取到。
(c)RUNTIME:表示该注解会随着JAVA源代码一起编译到class文件里面去,并且会在运行期通过反射的方式获取到。
请看一个示例:
首先定义一个注解:
package com.shengsiyuan.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//注解也可以修饰注解,该注解修饰下面自定义的注解,通过设定
//RetentionPolicy的值为RUNTIME表示该自定义的注解会被编
//译到CLASS文件当中,而且可以在运行期通过反射的方式获取到(具体请查看一遍API文档,很有必要!)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
String hello() default "shengsiyuan";
String world();
}
然后定义一个类,用这个Annotation去修饰
package com.shengsiyuan.annotation;
@MyAnnotation(hello = "beijing", world = "shanghai")
public class MyTest
{
//一个方法可以被多个注解所修饰。
@MyAnnotation(hello = "tianjin", world = "shangdi")
@Deprecated
@SuppressWarnings("unchecked")
public void output()
{
System.out.println("output something!");
}
}
接着定义一个类,并通过反射相关API去获得自定义注解的相关信息
package com.shengsiyuan.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
//该类拿到修饰MyTest里方法的Annotation
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语句里面来说明MyAnnotation的RetentionPolicy的值为Runtime(为什么请查API文档!)
if(method.isAnnotationPresent(MyAnnotation.class))
{
method.invoke(myTest, new Object[]{});
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
String hello = myAnnotation.hello();
String world = myAnnotation.world();
System.out.println(hello + ", " + world);
}
//只会得到Myannotation和Deprecated两个Annotation,因为只有这两个Annotation的RetentionPolicy
//的值为Runtime,只有RetentionPolicy的值为Runtime才会在运行期通过反射相关API拿到Annotation的相关信息。
Annotation[] annotations = method.getAnnotations();
for(Annotation annotation : annotations)
{
System.out.println(annotation.annotationType().getName());
}
}
}
2.关于@Target这个注解(建议去读一读API文档,介绍的很详细)
简要描述:指示注解类型所适用的程序元素的种类。如果注解类型声明中不存在 Target 元注解,则声明的类型可以用在任一程序元素上。
每一个Target都要给他一个ElementType,ElementType是一个枚举类型(具体可以查看API文档),它有8种取值:SOURCE,CLASS,RUNTIME,区别如下:
(a)ANNOTATION_TYPE:表示该注解可以去修饰另外一个注解
(b)COUNSTRUCTOR:表示该注解可以修饰构造方法
(c)FIELD:表示该注解可以修饰成员变量
(d)LOCAL_VARIABLE:表示该注解可以修饰局部变量
(e)METHOD:表示该注解可以修饰普通方法
(f)PACKAGE:表示该注解可以修饰包
(g)PARAMETER:表示该注解可以修饰方法参数
(h)TYPE:表示该注解可以修饰类、接口(包括注解类型)或枚举声明
请看示例:
package com.shengsiyuan.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)//表示该自定义注解只能用于修饰方法
public @interface MyTarget
{
String value();
}
接着定义一个类:
package com.shengsiyuan.annotation;
public class MyTargetTest
{
@MyTarget("hello")
public void doSomething()
{
System.out.println("hello world");
}
}
当把该自定义的注解放到方法上面后编译器不报错时,说明我们的实验是成功的(不需要写main方法进行测试)
对以上2个注解的总结:Retention与Target都是注解,Retention与RetentionPolicy搭配,Target与ElementType搭配。
3.关于@Documented(了解就行)
不多做描述,请看示例:
package com.shengsiyuan.annotation;
import java.lang.annotation.Documented;
@Documented //当一个注解被@Documented 修饰后表示被该注解修饰的对象(类或方法或其他)在生成JAVA DOC文档时,该注解会被加到修饰的对象的上面
public @interface DocumentedAnnotation
{
String hello();
}
然后用该注解去修饰某个方法
package com.shengsiyuan.annotation;
public class DocumentedTest
{
@DocumentedAnnotation(hello = "welcome")
public void method()
{
System.out.println("hello world");
}
}
当对DocumentedTest所在的包或工程生成JAVA DOC文档的时候,会发现自定义的注解会出现在method方法的上面
分享到:
相关推荐
《Hibernate Annotation 学习笔记》 在Java的持久化框架中,Hibernate以其强大的功能和易用性成为开发者首选之一。而Hibernate Annotation则是Hibernate提供的一种基于注解的实体映射方式,它极大地简化了传统XML...
【Hibernate - Annotation 学习笔记】 Hibernate 是一个流行的开源Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据存储。Annotation是Hibernate提供的一种元...
2. 自定义注解: - 自定义注解使用`@interface`关键字定义,例如`@MyAnnotation`。默认情况下,注解有一个名为"value"的属性,可以直接在使用注解时省略属性名。若使用其他名称,则需明确指定属性名和值,如`@...
2. **时间类型与@Temporal** - 对于时间类型数据(DATE, TIME, 或 TIMESTAMP),`@Temporal` 注解用于指定存储的精度。例如,`@Temporal(TemporalType.TIME)` 会将 `java.util.Date` 对象存储为数据库中的时间类型...
考研英语GCC 中文手册.rar J2EE interview book Photo Frame Genius 2.3 破解版 Hiberate Annotation学习笔记 2008年11月份希赛模拟题 multisim 入门帮助文件和元件参数 精通PHP5 光盘源文件 深入理解LINUX 第三版 ...
Hibernate_annotation_学习笔记 第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 第6课 第一个示例Hibernate HelloWorld 7 第7课 建立Annotation版本的HellWorld 9 第8课 ...
《MLDN学习笔记——Annotation》这篇博文主要探讨的是在编程领域中,特别是Java语言中,关于Annotation(注解)的深入理解和应用。Annotation是Java语言提供的一种元数据,它为程序提供了额外的信息,这些信息可以被...
这篇"Spring MVC 学习笔记 七 controller中其他可用的annotation"可能涵盖了除我们常见的`@RequestMapping`之外的其他注解,这些注解使得控制器功能更加丰富和灵活。下面将详细探讨Spring MVC中Controller相关的注解...
2. 自定义注解: - 开发者可以根据需要创建自己的注解,通过@interface关键字定义。自定义注解可以没有任何元素,也可以包含成员变量(通常称为元素),并为其提供默认值。 3. 注解的保留策略: - 注解的生命周期...
【标签】:Hibernate, Annotation, 笔记, 总结, 注解 【正文】: Hibernate Annotation是Hibernate框架的一个重要特性,它允许开发者直接在Java类上使用注解来定义对象的数据库映射,从而避免了传统的XML配置文件...
张龙的Java SE课程笔记涵盖了这个领域的许多关键知识点。 1. **Java环境搭建**:首先,学习Java SE需要安装Java Development Kit (JDK),设置好环境变量`JAVA_HOME`、`PATH`和`CLASSPATH`,以便于编译和运行Java...
Java Annotation学习整理
Java JDK6学习笔记是针对Java编程语言初学者和进阶者的一份宝贵资源,它涵盖了Java的基础语法,并通过经典且易于理解的实例进行讲解。在本文中,我们将深入探讨Java JDK6中的关键概念和特性,以帮助你更好地理解和...
在这个小例子中,我们将深入探讨如何利用Struts2的Annotation配置来构建一个简单的应用。 首先,让我们了解什么是Annotation。在Java中,Annotation是一种元数据,它提供了一种安全的方式向编译器、JVM或者第三方...
Java学习笔记是由知名IT教育专家林信良编著的一本深受好评的编程教材,特别适合初学者入门。这本书深入浅出地介绍了Java编程语言的基础知识和核心概念,旨在帮助读者快速掌握这一强大的开发工具。 首先,书中从Java...