- 浏览: 50498 次
- 性别:
- 来自: 青岛
最新评论
学习java的人都知道java中有javadoc这样的java注解,这类注解是用来生成帮助文档用的。
在EJB、Spring、Hibernate、Struts现都可用注解方式配置应用,但是我们对java annotation又有多少了解呢
其实annotation说是元数据(元数据大家应该不陌生--元数据 最本质、最抽象的定义为: data about data (关于数据的数据-- 关于数据的数据或者叫做用来描述数据的数据 )
元数据的作用
如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:
l 编写文档:通过代码里标识的元数据生成文档。
l 代码分析:通过代码里标识的元数据对代码进行分析。
l 编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。
先看看怎么定义一个annotation
public @interface TestMethodAnnotation { }
就是在定义接口的interface前加@
再看使用方法
@TestMethodAnnotation public String getName() { return name; }
添加变量
public @interface TestMethodAnnotation { boolean serialize() default true; }
@TestMethodAnnotation(serialize = false) public String getName() { return name; }
为变量赋默认值
public @interface TestMethodAnnotation { boolean serialize() default true; }
限定注释使用范围
当我们的自定义注释不断的增多也比较复杂时,就会导致有些开发人员使用错误,主要表现在不该使用该注释的地方使用。为此,Java 提供了一个ElementType 枚举类型来控制每个注释的使用范围,比如说某些注释只能用于普通方法,而不能用于构造函数等。下面是Java 定义的ElementType 枚举:
public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field declaration (includes enum constants) */ FIELD, /** Method declaration */ METHOD, /** Parameter declaration */ PARAMETER, /** Constructor declaration */ CONSTRUCTOR, /** Local variable declaration */ LOCAL_VARIABLE, /** Annotation type declaration */ ANNOTATION_TYPE, /** Package declaration */ PACKAGE }
添加使用范围
@Target(ElementType.METHOD) public @interface TestMethodAnnotation { boolean serialize() default true; }
这样表明该annotation只能用于方法注解
注释保持性策略
public enum RetentionPolicy { /** * Annotations are to be discarded by the compiler. */ SOURCE, /** * Annotations are to be recorded in the class file by the compiler * but need not be retained by the VM at run time. This is the default * behavior. */ CLASS, /** * Annotations are to be recorded in the class file by the compiler and * retained by the VM at run time, so they may be read reflectively. * * @see java.lang.reflect.AnnotatedElement */ RUNTIME }
CLASS 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。即要通过java反射得到它是得不到的 |
RUNTIME 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。 |
SOURCE 编译器要丢弃的注释。即要通过java反射得到它是得不到的 |
使用策略;
注释保留策略。此枚举类型的常量描述保留注释的不同策略。它们与 Retention
元注释类型一起使用,以指定保留多长的注释。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TestMethodAnnotation { boolean serialize() default true; }
运行时注解的读取
类类型注解
TestBean testbean = new TestBean(); Class clazz = testbean.getClass(); TestClassAnnotation testClassAnnotation = (TestClassAnnotation) clazz .getAnnotation(TestClassAnnotation.class);
方法类型注解
Method readMethod = prop.getReadMethod(); System.out.print(",readMethod:" + readMethod.getName()); 。。。。。。。。。。。。。。。 TestMethodAnnotation testAnnotation = readMethod .getAnnotation(TestMethodAnnotation.class); if (testAnnotation != null) { System.out.println("serialize:" + testAnnotation.serialize()); }
以下为完整的测试用例:
只能用于方法类型
package com.parkingfo.test.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TestMethodAnnotation { boolean serialize() default true; }
只能用于类类型
package com.parkingfo.test.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface TestClassAnnotation { String descript(); }
使用
package com.parkingfo.test; import com.parkingfo.test.annotation.TestClassAnnotation; import com.parkingfo.test.annotation.TestMethodAnnotation; @TestClassAnnotation(descript = "这是测试描述") public class TestBean extends Object { private String name; @TestMethodAnnotation(serialize = false) public String getName() { return name; } /** * @param name */ public void setName(String name) { this.name = name; } @Override public String toString() { return super.toString(); } }
测试类
package com.parkingfo.test; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import com.parkingfo.test.annotation.TestClassAnnotation; import com.parkingfo.test.annotation.TestMethodAnnotation; public class Test { /** * @param args */ public static void main(String[] args) { TestBean testbean = new TestBean(); Class clazz = testbean.getClass(); TestClassAnnotation testClassAnnotation = (TestClassAnnotation) clazz .getAnnotation(TestClassAnnotation.class); System.out.println(testClassAnnotation.descript()); BeanInfo beanInfo; try { beanInfo = Introspector.getBeanInfo(clazz); PropertyDescriptor[] props = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor prop : props) { String propName = prop.getName(); System.out.print("propterty:" + propName); Method readMethod = prop.getReadMethod(); System.out.print(",readMethod:" + readMethod.getName()); Method writeMethod = prop.getWriteMethod(); if (writeMethod != null) { System.out.print(",writeMethod:" + writeMethod.getName()); } System.out.println(); TestMethodAnnotation testAnnotation = readMethod .getAnnotation(TestMethodAnnotation.class); if (testAnnotation != null) { System.out.println("serialize:" + testAnnotation.serialize()); } } } catch (IntrospectionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
测试类中用到了得到javabean信息的类Introspector的getBeanInfo(Class clazz)方法得到javabean的信息
转自http://blog.csdn.net/buyaore_wo/archive/2010/09/27/5909754.aspx
发表评论
-
使用maven插件时报错
2011-08-31 10:44 14762使用maven插件时总是 ... -
安装Mule3到Tomcat
2011-01-25 15:20 34501. Tomcat中修改conf/server.xml,加入监 ... -
转 Eclipse 版本编号含义
2010-12-28 22:34 16451. Eclipse的版本号(X.Y.Z)是有含义的。X ... -
freemarker空值的多种处理方法
2010-12-27 09:08 5130默认情况下,freemarker的变量必须有值,如果没有被赋值 ... -
soa在互联网中的应用
2010-12-19 21:51 898这是支付宝在soa上的应用的一个讲演,讲演者是支付宝的架构师— ... -
插件式系统架构设计简介
2010-12-19 21:13 1479软件的工业化使得软 ... -
Spring发送电子邮件发件人中文名乱码问题解决方法
2010-12-17 12:32 4318网站重构,一部分用户动作需要发送邮件通知给相关人员,但是通过s ... -
点亮网站的rss图标
2010-11-15 15:54 877RSS也叫聚合RSS是在线共享内容的一种简易方式(也叫聚合内容 ... -
Urlrewrite配置不当造成死循环问题解析
2010-11-15 15:38 1253OECP社区中需要对博客标签进行url重写,把类似“/blog ...
相关推荐
Java 注解(Annotation)是Java 5.0版本引入的一种元数据机制,它为代码提供了额外的信息,这些信息可以被编译器、JVM或工具用来执行特定的任务,如代码分析、验证、生成代码等。本文主要介绍了Java注解的基本概念、...
在《Java Annotation入门》之后的这篇《重难点之JavaAnnotation手册》中,作者深入探讨了Annotation的概念、定义以及其在Java开发中的应用。 一、Annotation是什么? Annotation是一种在代码中添加的特殊注解,用于...
Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是一种描述数据的数据,它提供了一种安全的方式,使我们可以在不改变程序代码本身的情况下,向编译器或运行时环境提供额外的...
Java 注解(Annotation)是 Java 语言中的一个重要特性,它为程序员提供了元数据,即关于数据的数据。在本文中,我们将深入理解 Java 注解的基本概念、用途、工作方式以及如何使用它们。 首先,让我们了解为什么...
### Java学习教程-基础入门及提高 #### 一、引言与编程概念 Java作为一种强大的编程语言,为我们提供了一种高效、灵活的方式来表达思想和技术解决方案。与其他编程语言不同的是,Java不仅仅是一系列特性的简单集合...
在Java编程中,注解(Annotation)是一种强大的工具,它允许程序员向源代码中添加元数据,这些元数据可以被编译器或运行时环境用于各种目的,如代码分析、验证、生成代码等。自定义注解是Java注解机制的一个重要方面,...
GraphQL-Java批注 是一个很棒的库,但是它...入门 (Gradle语法) dependencies { compile " io.github.graphql-java:graphql-java-annotations:8.3 " } (Maven语法) < groupId> io . github . graphql - java
Java注解是Java编程语言中的一个重要特性,它提供了一种元数据的方式,使得开发者可以在代码中添加额外的信息,这些信息可以被编译器或者运行时环境用来进行代码分析、验证或者自动化处理。本教程将带你深入理解Java...
Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是关于数据的数据,可以用来提供额外的信息,如代码的解释、编译时或运行时的处理指令等。注解在Java中扮演着代码文档、编译器...
Java学习手册 - 零基础入门 Java是一种广泛使用的高级编程语言,由Sun Microsystems(现为Oracle公司)在1995年推出。它的设计目标是具有“一次编写,到处运行”的特性,使得开发者可以编写代码在一个平台上编译,...
17. **注解(Annotation)**:注解是元数据的一种形式,可以提供编译器和运行时的信息,用于代码的编译、部署和动态检查。 18. **IO流**:Java的I/O流体系支持对文件、网络、内存等的数据读写,包括字节流、字符流...
Java Spring注解入门 Java Spring框架中,注解是一种非常重要的概念,它可以帮助我们简化配置文件的编写,并提高代码的可读性和维护性。在本节中,我们将学习如何使用Spring注解来实现属性的自动装配。 1. 使用...
自定义注解则需要定义一个接口,它继承自`java.lang.annotation.Annotation`。例如,你可以创建一个`@MyAnnotation`,并在其中声明一些元素,这些元素可以是基本类型、其他注解或者字符串等。自定义注解的实例可以在...
13. **注解(Annotation)**:注解是元数据的一种形式,提供了一种安全的方式向编译器和JVM传递信息,用于代码的编译、部署、运行时检查等。 14. **Java标准库**:Java标准库(Java API)包含大量预先定义的类和...
19. **注解(Annotation)**:注解是Java 5引入的特性,用于提供元数据,可以用于编译时和运行时的处理。 20. **泛型**:泛型增加了类型安全,允许在类、接口和方法中使用类型参数,避免了类型转换的麻烦。 “Java...
### Java语言基础入门教程——注解 #### 一、引言与目标 本文档旨在介绍Java语言中的注解(Annotation)及其使用方法。通过本章节的学习,读者将能够理解注解的基本概念,学会如何定义注解,并掌握如何在实际开发...
Java注解(Annotation)是Java编程语言的一个重要特性,它提供了一种安全的方式来元数据(metadata)与程序元素关联,如类、接口、字段和方法等。注解不会改变程序的基本结构,但它们可以被编译器、JVM或工具在编译...
本篇文章将聚焦于MyBatis中的注解(Annotation)与XML配置的结合使用,旨在帮助开发者更深入地理解这一关键特性。 首先,MyBatis允许我们使用注解来简化Mapper接口的定义,无需编写XML映射文件。例如,我们可以在...