`

深入理解Java:注解(Annotation)--注解处理器

 
阅读更多

 如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器。


注解处理器类库(java.lang.reflect.AnnotatedElement):

  Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口。除此之外,Java在 java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素,该接口主要有如下几个实现类:

  Class:类定义
  Constructor:构造器定义
  Field:累的成员变量定义
  Method:类的方法定义
  Package:类的包定义

  java.lang.reflect 包下主要包含一些实现反射功能的工具类,实际上,java.lang.reflect 包所有提供的反射API扩充了读取运行时Annotation信息的能力。当一个Annotation类型被定义为运行时的Annotation后,该注 解才能是运行时可见,当class文件被装载时被保存在class文件中的Annotation才会被虚拟机读取。
   AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对 象之后,程序就可以调用该对象的如下四个个方法来访问Annotation信息:

  方法1:<T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
  方法2:Annotation[] getAnnotations():返回该程序元素上存在的所有注解。
  方法3:boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.
   方法4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有 注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

  一个简单的注解处理器:  

复制代码
/***********注解声明***************/

/**
 * 水果名称注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
    String value() default "";
}

/**
 * 水果颜色注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
    /**
     * 颜色枚举
     * @author peida
     *
     */
    public enum Color{ BULE,RED,GREEN};
    
    /**
     * 颜色属性
     * @return
     */
    Color fruitColor() default Color.GREEN;

}

/**
 * 水果供应者注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
    /**
     * 供应商编号
     * @return
     */
    public int id() default -1;
    
    /**
     * 供应商名称
     * @return
     */
    public String name() default "";
    
    /**
     * 供应商地址
     * @return
     */
    public String address() default "";
}

/***********注解使用***************/

public class Apple {
    
    @FruitName("Apple")
    private String appleName;
    
    @FruitColor(fruitColor=Color.RED)
    private String appleColor;
    
    @FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路89号红富士大厦")
    private String appleProvider;
    
    public void setAppleColor(String appleColor) {
        this.appleColor = appleColor;
    }
    public String getAppleColor() {
        return appleColor;
    }
    
    public void setAppleName(String appleName) {
        this.appleName = appleName;
    }
    public String getAppleName() {
        return appleName;
    }
    
    public void setAppleProvider(String appleProvider) {
        this.appleProvider = appleProvider;
    }
    public String getAppleProvider() {
        return appleProvider;
    }
    
    public void displayName(){
        System.out.println("水果的名字是:苹果");
    }
}

/***********注解处理器***************/

public class FruitInfoUtil {
    public static void getFruitInfo(Class<?> clazz){
        
        String strFruitName=" 水果名称:";
        String strFruitColor=" 水果颜色:";
        String strFruitProvicer="供应商信息:";
        
        Field[] fields = clazz.getDeclaredFields();
        
        for(Field field :fields){
            if(field.isAnnotationPresent(FruitName.class)){
                FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class);
                strFruitName=strFruitName+fruitName.value();
                System.out.println(strFruitName);
            }
            else if(field.isAnnotationPresent(FruitColor.class)){
                FruitColor fruitColor= (FruitColor) field.getAnnotation(FruitColor.class);
                strFruitColor=strFruitColor+fruitColor.fruitColor().toString();
                System.out.println(strFruitColor);
            }
            else if(field.isAnnotationPresent(FruitProvider.class)){
                FruitProvider fruitProvider= (FruitProvider) field.getAnnotation(FruitProvider.class);
                strFruitProvicer=" 供应商编号:"+fruitProvider.id()+" 供应商名称:"+fruitProvider.name()+" 供应商地址:"+fruitProvider.address();
                System.out.println(strFruitProvicer);
            }
        }
    }
}

/***********输出结果***************/
public class FruitRun {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        FruitInfoUtil.getFruitInfo(Apple.class);
        
    }

}

====================================
 水果名称:Apple
 水果颜色:RED
 供应商编号:1 供应商名称:陕西红富士集团 供应商地址:陕西省西安市延安路89号红富士大厦
复制代码

   Java注解的基础知识点(见下面导图)基本都过了一遍,下一篇我们通过设计一个基于注解的简单的ORM框架,来综合应用和进一步加深对注解的各个知识点的理解和运用。

分享到:
评论

相关推荐

    SpringMVC源码总结(二)mvc:mvc:annotation-driven背后的那些事

    这篇博客将深入探讨`mvc:annotation-driven`背后的工作原理以及相关的知识点。 首先,`mvc:annotation-driven`是一个XML配置元素,它简化了对Spring MVC应用中注解驱动功能的配置。通过添加这个元素,我们无需手动...

    SpringMVC源码总结(三)mvc:annotation-driven和mvc:message-converters简单介绍

    在Spring MVC框架中,`mvc:annotation-driven`和`mvc:message-converters`是两个非常重要的元素,它们在处理基于注解的控制器和数据转换方面起着关键作用。本篇文章将深入探讨这两个组件的工作原理以及如何在实际...

    javax.annotation-api-1.3.2 jar包.rar

    在Java编程语言中,...通过深入理解和正确使用`javax.annotation-api-1.3.2.jar` 中提供的注解,开发者可以编写出更加简洁、可维护且易于扩展的代码,特别是在企业级Java应用开发中,注解的运用是不可或缺的一部分。

    hibernate-validator-annotation-processor-4.3.1.final-sources.jar.zip

    解压并查看“hibernate-validator-annotation-processor-4.3.1.final-sources.jar”中的源码,我们可以深入理解其内部实现,包括如何解析和处理验证注解,以及如何生成验证元数据。这对于开发者来说是极其宝贵的...

    annotation-file-utilities.jar.zip

    总结起来,`annotation-file-utilities.jar.zip`是一个强大的Java注解处理工具库,它为开发者提供了处理注解的便利,使得注解的使用更加灵活和广泛。无论是在代码质量控制、自动化测试还是在构建流程中,都有其发挥...

    Annotation--学习:JDK内建Annotation

    自定义注解需要相应的处理器来处理,这通常通过Java的注解处理工具(Annotation Processing Tool, apt)或Java Compiler API实现。处理器会在编译时自动触发,解析注解并执行相应逻辑。 6. **注解的应用场景** - ...

    JAVA 注解---积累

    编译时处理通常通过编写注解处理器(Annotation Processor)实现,这些处理器在编译期间被JDK调用,可以生成额外的源代码或进行验证。运行时处理则需要在程序运行时通过反射API获取并处理注解信息。 注解的应用广泛...

    java-annotation-processor:JAVA注释处理器

    Java注释处理器(Annotation Processor)是Java平台提供的一种机制,用于在编译期间对源代码进行分析、修改或生成新的源...这将有助于你深入理解Java的注解处理机制,并可能启发你在自己的项目中如何有效利用这一功能。

    java-annotation-processor-client:Java注释处理器客户端

    首先,让我们深入理解Java注释处理器的工作原理。Java注释处理器基于JSR 269(也称为"Processing API"),它是Java平台标准的一部分,允许开发者在编译时执行自定义逻辑。注释处理器会在编译器解析源代码时被调用,...

    annotation-1.4.14.jar.zip

    《深入理解Java注解(Annotation)与jar包》 在Java编程中,注解(Annotation)扮演着重要的角色,它是元数据的一种形式,为代码提供了附加信息,这些信息可以被编译器、JVM或其他工具读取并执行相应操作。在Java SE ...

    java-annotation-design.pdf

    ### Java注解系统扩展——JSR 308 #### 引言 JSR 308 提案旨在对 Java 的注解系统进行扩展,使其能够应用到几乎任何类型的使用场景上。相比于 Java SE 6 只允许在类、方法、字段或变量声明处使用注解,JSR 308 ...

    hibernate-validator-annotation-processor-5.1.0.CR1.zip

    "Hibernate Validator Annotation Processor 5.1.0.CR1"是该框架的一个特定版本,主要关注于编译时注解处理器。这个版本的发布可能包含了性能优化、新特性和bug修复。 【描述】"generate-default-impl-maven-plugin...

    java注解源码-Spring-Configuration-using-Annotation-and-Java-Source-Code:Spr

    本项目“Spring-Configuration-using-Annotation-and-Java-Source-Code”深入探讨了如何使用Java注解来构建Spring应用的配置。以下是关于Java注解和Spring框架在配置中的应用的详细知识点: 1. **Java注解**: - ...

    JAVA Annotation学习

    Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是关于数据的数据,可以提供额外的信息,这些信息虽然不是程序运行所必需的,但能够帮助编译器、JVM(Java虚拟机)或工具更好...

    java注解annotation.rar

    Java注解,也称为 Annotation,是Java编程语言中的一种元数据机制,用于向编译器、JVM(Java虚拟机)或工具提供有关代码的信息。这些信息可以用来进行编译时检查、运行时处理,或者作为配置信息。注解不是程序的一...

    探索Java注解的神秘世界:Annotation全解析

    3. **代码生成**:利用注解处理器在编译时自动生成代码,比如使用 Google 的 AutoValue 库来自动生成不可变对象的源代码。 4. **性能优化**:如使用 `@Cacheable` 来缓存方法的结果以提高性能。 5. **安全认证**:...

    java注解深入理解

    Java注解是Java编程语言中的一个重要特性,它...通过深入理解注解的工作原理和使用场景,开发者可以更好地利用这一特性,提高代码的效率和质量。同时,熟悉如何创建和处理自定义注解也是现代Java开发者的必备技能之一。

    Java Annotation注解技术

    Java Annotation注解技术是自Java SE 5.0版本引入的一种元编程机制,它允许程序员在源代码的各个层面(如类、方法、变量等)添加元数据,以供编译器、JVM或第三方工具在编译时或运行时进行处理。Annotation简化了...

    Java自定义注解实例

    ### 一、Java注解概述 1. **定义**: 注解是一种声明式的编程元素,以`@`符号开头,后面跟着注解的名称。它们可以应用于类、接口、方法、变量等不同级别。 2. **预定义注解**: Java标准库提供了若干预定义注解,如`...

Global site tag (gtag.js) - Google Analytics