java学习笔记11--Annotation

Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息。

java.lang.annotation Annotation接口是所有的Annotation都必须实现的接口。

系统内建的Annotation

在JDK1.5之后,系统中已经建立了如下的三个内建的Annotation类型,用户直接使用即可。

@Override:覆写的Annotation

@Deprecated:不赞成使用的Annotation

@SuppressWarnings:压制安全警告的Annotation

自定义Annotation

Annotation定义格式:

【public】 @interface  Annotation名称{

             数据类型   变量名称();

}

  1. public @interface Meaning {
  2. String value();
  3. }

之后就直接可以在程序中使用@Meaning的格式

  1. @Meaning(value="itmyhome")
  2. class Demo{
  3. }

可以在Annotation中设置一个参数,用来接收变量的内容,如上面的value,使用Annotation的时候也必须给参数赋值如:value="itmyhome"

既然可以设置一个参数,则同时也就可以设置多个参数。

  1. public @interface Meaning {
  2. String key();
  3. String value();
  4. }

此Annotation在使用的时候 需要设置两个参数,一个key一个value

  1. @Meaning(key="hi",value="itmyhome")
  2. class Demo{
  3. }

也可以设置一个数组进去

  1. public @interface Meaning {
  2. String[] value();
  3. }

接收的内容要传递数组

  1. @Meaning(value={"hello","world"})
  2. class Demo{
  3. }

以上所定义的全部的Annotation中有一个特点,所有的参数内容需要在使用注释的时候设置上去,那么也可以为一个参数设置默认的内容,在声明的时候使用default即可。

  1. public @interface Meaning {
  2. String value() default "";  //默认为空
  3. }

在使用的时候就可以不设置值

  1. @Meaning
  2. class Demo{
  3. }

在操作中,对于一个Annotation而言有时候会固定期取值范围,只能取固定的几个值,这个时候实际上就需要依靠枚举。

  1. public enum FormItemType {  //定义枚举类型
  2. hidden,text,select,date
  3. }

定义Annotation

  1. public @interface Meaning {
  2. FormItemType value() ;  //设置为枚举类型
  3. }

Annotation的取值只能是枚举类型中的值

  1. @Meaning(value=FormItemType.date)
  2. class Demo{
  3. }

Retention和RetentionPolicy

在Annotation中,可以使用Retention定义个Annotation的保存范围,此Annotation的定义如下:

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.FIELD)
  3. public @interface Meaning {
  4. FormItemType value() ;  //设置为枚举类型
  5. }

在以上的Retetion定义中存在了一个RetentionPolicy的变量,此变量用于指定Annotation的保存范围,RetentionPolicy包含三种范围

在三个范围中,最重要的就是RUNTIME范围,因为在执行的时候起作用。

内建Annotation的RetentionPolicy

三个内建的Annotation的定义:

Override定义采用的是@Retention(RetentionPolicy.SOURCE) 只能在源文件中出现

Deprecated定义采用的是@Retention(RetentionPolicy.RUNTIME),可以在执行时出现

SuppressWarnings定义采用的是@Retention(RetentionPolicy.SOURCE),只能在源文件中出现

一个Annotation如果要是想让其变得有意义,则必须结合反射机制取得Annotaion中设置的全部内容。

在Class类中存在以下几种与Annotation操作有关的方法

  1. package com.itmyhome;
  2. import java.lang.annotation.Annotation;
  3. import java.lang.reflect.Method;
  4. class Demo{
  5. @SuppressWarnings("unchecked")
  6. @Deprecated
  7. @Override
  8. public String toString(){
  9. return "hello";
  10. }
  11. }
  12. public class T {
  13. public static void main(String[] args) throws Exception{
  14. Class<?> c = Class.forName("com.itmyhome.Demo");
  15. Method mt = c.getMethod("toString");   //找到toString方法
  16. Annotation an[] = mt.getAnnotations(); //取得全部的Annotation
  17. for(Annotation a:an){
  18. System.out.println(a);
  19. }
  20. }
  21. }

此时已经取得了一个Annota。以上的操作实际上是通过三个系统内建的Annotation完成的,也可以自定义一个Annotation

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.METHOD)
  3. public @interface Meaning {
  4. FormItemType value() ;  //设置为枚举类型
  5. }
  1. package com.itmyhome;
  2. import java.lang.reflect.Method;
  3. class Demo{
  4. @Meaning(value=FormItemType.select)  //自定义Annotation
  5. @SuppressWarnings("unchecked")
  6. @Deprecated
  7. @Override
  8. public String toString(){
  9. return "hello";
  10. }
  11. }
  12. public class T {
  13. public static void main(String[] args) throws Exception{
  14. Class<?> c = Class.forName("com.itmyhome.Demo");
  15. Method mt = c.getMethod("toString");   //找到toString方法
  16. //指定的注释是否存在于此元素上
  17. if(mt.isAnnotationPresent(Meaning.class)){
  18. Meaning m = mt.getAnnotation(Meaning.class);  //得到指定的Annotation
  19. System.out.println(m.value());                //取得Annotation的值
  20. }
  21. }
  22. }

@Target

指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制,如:@Target(ElementType.ANNOTATION_TYPE)

ElementType的保存范围

java学习笔记11--Annotation的更多相关文章

  1. Java学习笔记11

    package welcome; import java.util.Scanner; /* * 代数问题:求解2x2线性方程 */ public class ComputeLinearEquation ...

  2. Java学习笔记 11/15:一个简单的JAVA例子

    首先来看一个简单的 Java 程序. 来看下面这个程序,试试看是否看得出它是在做哪些事情! 范例:TestJava.java   // TestJava.java,java 的简单范例  public ...

  3. Java 学习笔记(11)——异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用System.ou ...

  4. java学习笔记(11) —— Struts2与Spring的整合

    1.右键 项目名称 —— MyEclipse —— Add Spring Capabilities 2.选取 Copy checked Library contents to project fold ...

  5. Java学习笔记11(面向对象四:多态)

    多态: 举例:描述一个事物的多种形态,如Student类继承了Person类,一个Student对象既是Student,又是Person 多态体现为:父类引用变量可以指向子类对象 多态的前提:必须有子 ...

  6. Java学习笔记-11.运行期间类型鉴定

    1.Class对象的getClasses()方法获取的是该类中所有的公共的内部类,以及从父类,父接口继承来的内部类.getinterfaces()方法返回类继承的所有接口. import javax. ...

  7. Java 学习笔记(11)——lambda 表达式

    在写Java代码的时候,如果某个地方需要一个接口的实现类,一般的做法是新定义一个实现类,并重写接口中的方法,在需要使用的时候new一个实现类对象使用,为了一个简单的接口或者说为了一个回调函数就得额外编 ...

  8. Java 学习笔记(11)——多线程

    Java内部提供了针对多线程的支持,线程是CPU执行的最小单位,在多核CPU中使用多线程,能够做到多个任务并行执行,提高效率. 使用多线程的方法 创建Thread类的子类,并重写run方法,在需要启动 ...

  9. Java学习笔记11(this,super)

    this在构造方法间的使用, public class Person { private String name; private int age; public Person() { //this( ...

随机推荐

  1. c语言,内存字节对齐

    引用:内存字节对齐 写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧. /************* ...

  2. PHP:根据IP地址获取所在城市

    文件目录: ipLocation -----qqwry ----------QQWry.Dat -----ipCity.class.php ipCity.class.php文件代码: <?php ...

  3. 使用ssh远程执行命令批量导出数据库到本地(转)

    前天正在跟前端的同事调试功能.服务器开好,模拟的玩家登录好,就在倒计时.这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据.好吧,我看了一下时间,1 ...

  4. 稳定婚姻问题和Gale-Shapley算法(转)

    什么是算法?每当有人问作者这样的问题时,他总会引用这个例子:假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚.如果你已经知道这些女孩儿在每个男孩儿心目中的排名,以及男孩儿们在 ...

  5. Ruby on Rails 實戰聖經阅读(三)

    由于是1.8.x:圣经的1.9.3差太多,所以另外按1.8.X来创建hello world 第一個Hello World!! 1. 创建项目rails -d mysql first 2.创建控制器  ...

  6. Windows Azure入门教学系列 (一): 创建第一个WebRole程序

    原文 Windows Azure入门教学系列 (一): 创建第一个WebRole程序 在第一篇教学中,我们将学习如何在Visual Studio 2008 SP1中创建一个WebRole程序(C#语言 ...

  7. Java自注三进入

    由于近期学的内容实际操作比較多,所以新的笔记就用代码为主体吧! 本回主要内容是输入,Java中主要用Scanner类和BufferedReader.整体来说不难,但有些细节能够总结,看代码: impo ...

  8. python实现刷博器(适用于新浪、搜狐)

    本文总结于智普教育: 做点小东西,有成就感,才会有动力学下去哈! 先上代码: 1: import webbrowser as web 2: import time 3: import os 4: co ...

  9. PP屏幕增强点

    生产订单CO01/CO02/CO03屏幕增强 smod:PPCO0012 工票输入CO11N SMOD:CONFPP07 增强里经常会用内存读取数据:比如: ) TYPE c. FIELD-SYMBO ...

  10. 使用RNSwipeViewController类库进行视图切换

    如今很多应用已经不再局限于点击按钮触发事件来进行视图之间切换,为迎合给予用户更好体验,体现iOS系统极佳用户体验,使用手势来进行各个视图之间切换,用户至于一个大拇指在屏幕中央就可浏览到很多信息: 关于 ...