`
lxcaoxin
  • 浏览: 127360 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

Java自定义注释@interface的用法

    博客分类:
  • Java
 
阅读更多
一、什么是注释

    说起注释,得先提一提什么是元数据(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中的变量。
分享到:
评论
1 楼 xuriyunhai 2012-08-17  
  帮大忙了 非常感谢!!!!!

相关推荐

    java自定义注解实现由类自动生成表

    在Java编程中,自定义注解(Annotation)是一种强大的元数据机制,允许程序员在源代码中插入信息,这些信息可以被编译器、IDE或运行时环境用来进行各种处理。自定义注解使得代码更加可读,易于维护,并且可以自动化...

    Java自定义注解使用反射获取字段注解

    Java自定义注解是Java语言中的一个重要特性,它允许我们创建自己的元数据,为代码提供额外的信息。在Java中,注解(Annotation)主要用于编译器检查、代码生成、运行时处理等方面。本文将深入探讨如何通过反射机制来...

    Android使用自定义注释来初始化控件

    一种常见的方法是使用自定义注释(Annotations)来简化UI控件的初始化过程。本文将深入探讨如何在Android应用中创建并使用自定义注释来实现这一目标。 首先,让我们理解什么是注释。在Java(Android是基于Java的)...

    真实案例!java自定义注解实战!.pdf

    Java自定义注解是Java语言中的一个重要特性,它允许开发者在代码中添加元数据,以提供额外的信息,比如编译时或运行时的处理规则。注解与传统的注释不同,注解可以被编译器或者JVM读取并执行相应的处理。在Java中,...

    java 自定义注解 经典学习文档

    ### Java自定义注解经典学习文档 #### 一、引言 Java自定义注解是Java 5.0及后续版本引入的一项重要功能。通过使用注解,开发人员能够在不改变程序逻辑的情况下向代码中添加元数据。这些元数据可以被编译器或者运行...

    史上最完整java注释教程

    Java注释是编程语言中的一种重要工具,用于提供元数据信息,这些信息可以在代码的生命周期中起到多种作用,包括但不限于帮助开发...通过合理使用内置注释和创建自定义注释,我们可以构建更加健壮和易于管理的Java项目。

    Java_Annotation详解

    自定义注释类型的基本结构类似接口,但需要使用`@interface`关键字定义,例如: ```java public @interface NewAnnotation {} ``` 此自定义注释可以像内置注释一样应用到类、方法或字段上,如: ```java public ...

    SpringBoot AOP各种注解、自定义注解、鉴权使用案例(免费下载)

    例如,我们可以使用`@Before`注解实现一个简单的方法调用前的日志记录: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore...

    Java使用自定义注解实现函数测试功能示例

    在 Java 中,自定义注解使用 @interface 定义。Annotation 是 Java 5 中引入的一种元数据,用于提供关于程序元素的信息,可以修饰程序中的类、方法、变量、接口等。通常,我们会把 Annotation 放在所有修饰符之前。 ...

    Annotation注解的介绍和使用

    当子类的方法声明使用此注释时,编译器将检查是否有对应的超类方法可以重写,如果没有,则会产生编译错误。 ##### 2.3 `@Deprecated`注释 `@Deprecated`注释用于标记那些不推荐使用的方法或类,表明它们可能在未来...

    Java软件开发实战 Java基础与案例开发详解 16-3 自定义标注类型 共7页.pdf

    通过使用标注,开发者能够更方便地对代码进行注释,并且这些注释可以被编译器或运行时工具所读取和处理。Java语言本身提供了几种内置的标注类型,比如`@Override`用于标记重写的方法,`@Deprecated`用于标记废弃的...

    整合maven+mybatis+generator生成java自定义model实体类,dao接口和mapper映射文件

    标题"整合maven+mybatis+generator生成java自定义model实体类,dao接口和mapper映射文件"所涉及的知识点主要包括以下几个方面: 1. Maven配置与集成:在项目中引入Maven,我们需要在`pom.xml`文件中添加相应的依赖,...

    java1.5 annotation注释源代码

    自定义注解需要通过@interface关键字来定义,并可以包含一些元素(或称为成员),这些元素可以有默认值。 ### 2. 注解的使用 - **保留策略**:注解可以有三种保留策略: - `SOURCE`:只在源代码级别保留,编译后...

    Java Validation Api如何实现自定义注解

    本文将详细介绍如何在Java中使用Validation API实现自定义注解。 首先,我们来看如何定义一个自定义注解。自定义注解通常需要使用 `@Constraint` 注解,并指定一个实现 `ConstraintValidator` 接口的类来处理校验...

    jdk注释讲解

    ### JDK注释详解:深入理解Java中的注解 在Java开发中,注解(Annotation)是一种重要的元数据机制,用于向编译器、工具或框架提供额外的信息,从而增强代码的功能性和可读性。本文将从JDK源注释出发,深入解析三种...

    JPA 和 注释文档

    定义自定义注释时,需要使用 `@interface` 关键字,并可以包含属性(带有默认值或非默认值)。 - **注释位置修饰符**:`@Target` 用于指定自定义注释可以应用于哪些程序元素,如方法、字段、构造函数等。 - **注释...

    Java代码注释规范.docx

    【Java代码注释规范】 Java代码注释规范是软件开发中的一个重要组成部分,它不仅有助于提升代码的可读性和可维护性,还能增强团队间的协作效率。遵循良好的编码规范,可以帮助开发者形成良好的编程习惯,培养更加...

    只是一个普通的小方法,描述了如何在类和方法上面添加注释和时间等等

    在Eclipse IDE中,你可以通过以下步骤自定义注释模板: 1. 打开Eclipse,进入“Window” &gt; “Preferences”。 2. 在左侧导航栏中,展开“Java” &gt; “Code Style” &gt; “Code Templates”。 3. 在右侧,点击...

    \java超强笔记(超级经典)

    在自定义注释时,要用元注释来进行描述。 如: import java.lang.annotation.*; @Target({ElementType.METHOD}) @Inherited @Retention(RetentionPolicy.RUNTIME) @Documented public...

Global site tag (gtag.js) - Google Analytics