`
wlo_o
  • 浏览: 50482 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

转 java annotation(注解)--入门

    博客分类:
  • Java
阅读更多

 

学习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

分享到:
评论

相关推荐

    Java Annotation入门.doc

    Java 注解(Annotation)是Java 5.0版本引入的一种元数据机制,它为代码提供了额外的信息,这些信息可以被编译器、JVM或工具用来执行特定的任务,如代码分析、验证、生成代码等。本文主要介绍了Java注解的基本概念、...

    重难点之JavaAnnotation手册.pdf

    在《Java Annotation入门》之后的这篇《重难点之JavaAnnotation手册》中,作者深入探讨了Annotation的概念、定义以及其在Java开发中的应用。 一、Annotation是什么? Annotation是一种在代码中添加的特殊注解,用于...

    入门级java 注解学习示例代码

    Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是一种描述数据的数据,它提供了一种安全的方式,使我们可以在不改变程序代码本身的情况下,向编译器或运行时环境提供额外的...

    java annotation入门

    Java 注解(Annotation)是 Java 语言中的一个重要特性,它为程序员提供了元数据,即关于数据的数据。在本文中,我们将深入理解 Java 注解的基本概念、用途、工作方式以及如何使用它们。 首先,让我们了解为什么...

    Java学习教程-基础入门及提高.doc

    ### Java学习教程-基础入门及提高 #### 一、引言与编程概念 Java作为一种强大的编程语言,为我们提供了一种高效、灵活的方式来表达思想和技术解决方案。与其他编程语言不同的是,Java不仅仅是一系列特性的简单集合...

    基于Java注解(Annotation)的自定义注解入门介绍

    在Java编程中,注解(Annotation)是一种强大的工具,它允许程序员向源代码中添加元数据,这些元数据可以被编译器或运行时环境用于各种目的,如代码分析、验证、生成代码等。自定义注解是Java注解机制的一个重要方面,...

    graphql-java-annotations:Java的GraphQL注释

    GraphQL-Java批注 是一个很棒的库,但是它...入门 (Gradle语法) dependencies { compile " io.github.graphql-java:graphql-java-annotations:8.3 " } (Maven语法) < groupId> io . github . graphql - java

    java-annotation:Java注解入门教程

    Java注解是Java编程语言中的一个重要特性,它提供了一种元数据的方式,使得开发者可以在代码中添加额外的信息,这些信息可以被编译器或者运行时环境用来进行代码分析、验证或者自动化处理。本教程将带你深入理解Java...

    Java+Annotation入门[定义].pdf

    Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是关于数据的数据,可以用来提供额外的信息,如代码的解释、编译时或运行时的处理指令等。注解在Java中扮演着代码文档、编译器...

    Java学习手册-零基础

    Java学习手册 - 零基础入门 Java是一种广泛使用的高级编程语言,由Sun Microsystems(现为Oracle公司)在1995年推出。它的设计目标是具有“一次编写,到处运行”的特性,使得开发者可以编写代码在一个平台上编译,...

    学Java流程--Java语言基础

    17. **注解(Annotation)**:注解是元数据的一种形式,可以提供编译器和运行时的信息,用于代码的编译、部署和动态检查。 18. **IO流**:Java的I/O流体系支持对文件、网络、内存等的数据读写,包括字节流、字符流...

    javaSpring注解入门[参考].pdf

    Java Spring注解入门 Java Spring框架中,注解是一种非常重要的概念,它可以帮助我们简化配置文件的编写,并提高代码的可读性和维护性。在本节中,我们将学习如何使用Spring注解来实现属性的自动装配。 1. 使用...

    java 注解的小demo,适合入门 pom

    自定义注解则需要定义一个接口,它继承自`java.lang.annotation.Annotation`。例如,你可以创建一个`@MyAnnotation`,并在其中声明一些元素,这些元素可以是基本类型、其他注解或者字符串等。自定义注解的实例可以在...

    JAVA基础入门到精通pdf

    13. **注解(Annotation)**:注解是元数据的一种形式,提供了一种安全的方式向编译器和JVM传递信息,用于代码的编译、部署、运行时检查等。 14. **Java标准库**:Java标准库(Java API)包含大量预先定义的类和...

    Java基础-经典入门教程

    19. **注解(Annotation)**:注解是Java 5引入的特性,用于提供元数据,可以用于编译时和运行时的处理。 20. **泛型**:泛型增加了类型安全,允许在类、接口和方法中使用类型参数,避免了类型转换的麻烦。 “Java...

    Java语言基础入门教程 Java实训教程 12.注解 共35页.pptx

    ### Java语言基础入门教程——注解 #### 一、引言与目标 本文档旨在介绍Java语言中的注解(Annotation)及其使用方法。通过本章节的学习,读者将能够理解注解的基本概念,学会如何定义注解,并掌握如何在实际开发...

    2020老杜最新Java零基础进阶视频教程-注解课件

    Java注解(Annotation)是Java编程语言的一个重要特性,它提供了一种安全的方式来元数据(metadata)与程序元素关联,如类、接口、字段和方法等。注解不会改变程序的基本结构,但它们可以被编译器、JVM或工具在编译...

    mybatis学习总结:annotation与xml结合示例

    本篇文章将聚焦于MyBatis中的注解(Annotation)与XML配置的结合使用,旨在帮助开发者更深入地理解这一关键特性。 首先,MyBatis允许我们使用注解来简化Mapper接口的定义,无需编写XML映射文件。例如,我们可以在...

Global site tag (gtag.js) - Google Analytics