`

spring_mvc

阅读更多

Java annotation 自定义注释@interface的用法

一、什么是注释

    说起注释,得先提一提什么是元数据(metadata)。所谓元数据就是数据的数据。也就是说,元数据是描述数据的。就象数据表中的字段一样,每个字段描 述了这个字段下的数据的含义。而J2SE5.0中提供的注释就是java源代码的元数据,也就是说注释是描述java源代码的。在J2SE5.0中可以自 定义注释。使用时在@后面跟注释的名字。
                                                                                   
二、J2SE5.0中预定义的注释

    在J2SE5.0的java.lang包中预定义了三个注释。它们是Override、Deprecated和SuppressWarnings。下面分别解释它们的含义。

       1.Override注释:仅用于方法(不可用于类、包的生命或其他),指明注释的方法将覆盖超类中的方法(如果覆盖父类的方法而没有注
释就无法编译该类),注释还能确保注释父类方法的拼写是正确(错误的编写,编译器不认为是子类的新方法,而会报错)
       2.@Deprecated注释:对不应再使用的方法进行注释,与正在声明为过时的方法放在同一行。使用被     Deprecated注释的方法,编译器会
提示方法过时警告(”Warring”)
       3.@SuppressWarnings注释:单一注释,可以通过数组提供变量,变量值指明要阻止的特定类型警告(忽略某些警告)。数组中的变量指明要阻 止的警告@SuppressWarnings(value={”unchecked”,”fallthrough”}))

三、自定义注释@interface

@interface:注释声明,定义注释类型(与默认的Override等三种注释类型类似)。请看下面实例:

注释类1:

package a.test;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FirstAnno {
String value() default "FirstAnno";
}

注释类2:

package a.test;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SecondAnnotation {
//  注释中含有两个参数
    String name() default "Hrmzone";
    String url() default "hrmzone.cn";

}

注释类3:

package a.test;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Kitto {
String value() default "kitto";
}

使用类:

package a.test;
@FirstAnno("http://hrmzone.cn")
public class Anno {
@Kitto("测试")
private String test = "";
//  不赋值注释中的参数,使用默认参数
    @SecondAnnotation()
    public String getDefault() {
            return "get default Annotation";
    }
    @SecondAnnotation(name="desktophrm",url="desktophrm.com")
    public String getDefine() {
            return "get define Annotation";
    }

}

测试类:

package a.test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class AnnoTest {
public static void main(String[] args) throws ClassNotFoundException {
  // 要使用到反射中的相关内容
  Class c = Class.forName("a.test.Anno");
  Method[] method = c.getMethods();
  boolean flag = c.isAnnotationPresent(FirstAnno.class);
  if (flag) {
   FirstAnno first = (FirstAnno) c.getAnnotation(FirstAnno.class);
   System.out.println("First Annotation:" + first.value() + "\n");
  }

  List<Method> list = new ArrayList<Method>();
  for (int i = 0; i < method.length; i++) {
    list.add(method[i]);
  }

  for (Method m : list) {
   SecondAnnotation anno = m.getAnnotation(SecondAnnotation.class);
   if(anno == null)
    continue;
  
   System.out.println("second annotation's\nname:\t" + anno.name()
     + "\nurl:\t" + anno.url());
  }
 
  List<Field> fieldList = new ArrayList<Field>();
  for(Field f : c.getDeclaredFields()){//访问所有字段
   Kitto k = f.getAnnotation(Kitto.class);
   System.out.println("----kitto anno: " + k.value());
  }
}

}


结合源文件中注释,想必对注释的应用有所了解。下面深入了解。
     深入注释:
     @Target:指定程序元定义的注释所使用的地方,它使用了另一个类:ElementType,是一个枚举类定义了注释类型可以应用到不同的程序元素以免使用者误用。看看java.lang.annotation 下的源代码:

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.ANNOTATION_TYPE) 
public @interface Target { 
    ElementType[] value(); 
}


     ElementType是一个枚举类型,指明注释可以使用的地方,看看ElementType类:
public enum ElementType { 
     TYPE, // 指定适用点为 class, interface, enum 
     FIELD, // 指定适用点为 field 
     METHOD, // 指定适用点为 method 
     PARAMETER, // 指定适用点为 method 的 parameter 
     CONSTRUCTOR, // 指定适用点为 constructor 
     LOCAL_VARIABLE, // 指定使用点为 局部变量 
     ANNOTATION_TYPE, //指定适用点为 annotation 类型 
     PACKAGE // 指定适用点为 package 
}
     @Retention:这个元注释和java编译器处理注释的注释类型方式相关,告诉编译器在处理自定义注释类型的几种不同的选择,需要使用 RetentionPolicy枚举类。此枚举类只有一个成员变量,可以不用指明成名名称而赋值,看Retention的源代码:

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.ANNOTATION_TYPE) 
public @interface Retention { 
    RetentionPolicy value(); 
}
     类中有个RetentionPolicy类,也是一个枚举类,具体看代码:

public enum RetentionPolicy { 
     SOURCE, // 编译器处理完Annotation后不存储在class中 
     CLASS, // 编译器把Annotation存储在class中,这是默认值 
     RUNTIME // 编译器把Annotation存储在class中,可以由虚拟机读取,反射需要 
}
     @Documented:是一个标记注释,表示注释应该出现在类的javadoc中,因为在默认情况下注释时不包括在javadoc中的。

所以如果花费了大量的时间定义一个注释类型,并想描述注释类型的作用,可以使用它。

注意他与@Retention(RetentionPolicy.RUNTIME)配合使用,因为只有将注释保留在编译后的类文件中由虚拟机加载,

然后javadoc才能将其抽取出来添加至javadoc中。
     @Inherited:将注释同样继承至使用了该注释类型的方法中(表达有点问题,就是如果一个方法使用了的注释用了@inherited,

那么其子类的该方法同样继承了该注释)
注意事项:
     1.所有的Annotation自动继承java.lang.annotation接口
     2.自定义注释的成员变量访问类型只能是public、default;(所有的都能访问,源作者没用到函数:getDeclaredFields而已)
     3.成员变量的只能使用基本类型(byte、short、int、char、long、double、float、boolean和String、Enum、Class、annotations以及该类型的数据)(没有限制,大家可以修改测试一下,就清楚)
     4.如果只有一个成员变量,最好将参数名称设为value,赋值时不用制定名称而直接赋值
     5.在实际应用中,还可以使用注释读取和设置Bean中的变量。
 来自:
http://www.blogjava.net/hao446tian/archive/2011/10/25/361960.html
分享到:
评论

相关推荐

    Spring_MVC 3.0整理汇总

    【Spring_MVC 3.0 整理汇总】 一、前言 Spring_MVC 3.0 是一款广泛使用的轻量级MVC框架,因其简洁的设计、强大的功能和优秀的性能,自3.0版本发布以来,深受开发者的青睐。与Struts2相比,Spring_MVC在学习曲线、...

    spring_mvc.zip_spring_spring mvc_springmvc_springmvc架构

    Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建控制器层,实现模型-视图-控制器(MVC)的设计模式。这个“spring_mvc.zip”压缩包很可能是为了帮助初学者快速入门...

    Spring_MVC_教程_快速入门_深入分析 高清文字版PDF

    Spring MVC是一个流行的Java框架,用于开发Web应用程序,遵循MVC(Model-View-Controller)设计模式。MVC模式将应用程序分成三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型代表业务对象和...

    spring_mvc.zip_Spring学生_spring mvc_springmvc 学生_springmvc 系统

    【Spring MVC 学生管理系统详解】 Spring MVC 是一个基于 Spring 框架的模型-视图-控制器(MVC)架构,它简化了在 Java Web 应用中的开发工作。在"spring_mvc.zip"中,我们可以看到一个针对学生管理系统的实例代码...

    Spring_MVC_3.0实战指南

    《Spring_MVC_3.0实战指南》是一本专注于Spring MVC 3.0技术的实践教程,旨在帮助开发者深入理解和熟练运用这一强大的Web应用程序开发框架。Spring MVC是Spring框架的一个重要组成部分,它提供了模型-视图-控制器...

    _Spring_mvc.zip_spring mvc

    Spring MVC 是一个强大的Java Web开发框架,它是Spring框架的一部分,专注于构建Web应用程序的后端控制器。这个压缩包 "_Spring_mvc.zip" 内含的可能是某个课程或项目中的源代码,用于教学或实践如何使用Spring MVC...

    spring_mvc所需jar包

    spring_mvc和mybatis_jar包: spring-context-4.3.2.RELEASE.jar spring-aop-4.3.2.RELEASE.jar spring-beans-4.3.2.RELEASE.jar spring-core-4.3.2.RELEASE.jar spring-expression-4.3.2.RELEASE.jar spring-web-...

    spring_mvc-学习

    Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建Web应用程序的后端控制器。在Spring MVC中,开发者可以利用模型-视图-控制器(MVC)架构模式来分离业务逻辑、数据处理和...

    spring_mvc代码_spring_mvc代码实例_

    Spring MVC 是 Spring 框架的一个模块,专为构建 Web 应用程序提供了一种模型-视图-控制器(MVC)架构。它简化了Java Web应用开发,将业务逻辑、数据处理和用户界面分离,使得开发者可以更专注于业务逻辑,而无需...

    spring_mvc搭建实例

    一个动态的java web 工程,使用了spring_mvc框架搭建了一个小小的实例,愿和大家一起共享之,谢谢。希望能帮助到搭建,最近也在打算再次使用spring_mvc框架,却发现网上却少有实例可以提供参考,故而得空自己写了一...

    spring_mvc_analyse

    spring_mvc_analyse

    spring_mvc_response

    本压缩包文件"spring_mvc_response"可能包含了一系列关于 Spring MVC 中响应处理相关的示例代码、配置文件和教程资料。 在 Spring MVC 中,响应处理是控制器(Controller)与视图(View)之间的重要环节,主要涉及...

    ssm_spring_mvc_maven.war

    ssm_spring_mvc_maven.war,页面用的bootstrap,实现了记录的增删改查,数据回显,模糊查询

    Spring_Mvc

    Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于处理Web应用的模型-视图-控制器(MVC)结构。在本文中,我们将深入探讨Spring MVC的基本概念、核心组件以及如何实现一个简单...

    Spring_MVC_3.0实战指南.ppt

    Spring_MVC_3.0实战指南,很好的资料,可以学习学习

    spring_mvc2

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建RESTful风格的Web应用程序提供了强大的支持。作为Spring框架的重要组成部分,Spring MVC以其模块化、松耦合和高度可配置性深受开发者喜爱。在“spring_mvc2...

    spring_mvc文档

    spring_mvc 文档spring_mvc 文档spring_mvc 文档spring_mvc 文档spring_mvc 文档spring_mvc 文档spring_mvc 文档spring_mvc 文档spring_mvc 文档spring_mvc 文档spring_mvc 文档spring_mvc 文档spring_mvc 文档

    Spring_MVC MongoDB

    Spring_MVC MongoDBSpring_MVC MongoDBSpring_MVC MongoDBSpring_MVC MongoDBSpring_MVC MongoDBSpring_MVC MongoDBSpring_MVC MongoDB

    Hotel_SPring_MVC

    【Spring MVC 框架详解】 Spring MVC 是一个基于 Java 的模型-视图-控制器(MVC)架构,是 Spring 框架的一部分,用于构建Web应用程序。它为开发者提供了强大的控制层,使得开发过程更加模块化,易于测试和维护。在...

Global site tag (gtag.js) - Google Analytics