文档章节

注解(Annotation)--注解处理器

boonya
 boonya
发布于 2015/04/17 09:24
字数 1033
阅读 121
收藏 19
点赞 0
评论 0

如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。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)
@Documentedpublic @interface FruitName {
    String value() default "";
}/**
 * 水果颜色注解
 * @author peida
 * */@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documentedpublic @interface FruitColor {    /**
     * 颜色枚举
     * @author peida
     *     */
    public enum Color{ BULE,RED,GREEN};    
    /**
     * 颜色属性
     * @return
     */
    Color fruitColor() default Color.GREEN;

}/**
 * 水果供应者注解
 * @author peida
 * */@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documentedpublic @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框架,来综合应用和进一步加深对注解的各个知识点的理解和运用。


本文转载自:http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html

共有 人打赏支持
boonya
粉丝 72
博文 214
码字总数 43922
作品 0
成都
高级程序员
Java注解(Annotation)详解

Java注解(Annotation)详解 1.Annotation的概念 An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may......

幻海流心
05/23
0
0
ButterKnife原理分析(二)注解的处理

上一篇我们讲解了ButterKnife的设计思想,理解了ButterKnife绑定相关源码的实现逻辑。但是它是怎么通过注解的方式生成的那些逻辑代码,这才是最让我们迫切想知道,因此在这篇,我将说说Butte...

Ihesong
2017/12/31
0
0
java --注解

1.什么是注解? 注解也叫元数据(用来描述数据的数据),它用来对某些元素进行说明/注释等。 注解是一个接口,程序可以通过反射来获取指定元素的Annotaion,然后通过Annotation对象来获取注解里...

求是科技
2016/09/25
29
0
springmvc学习笔记(3)-注解的处理器映射器和适配器

springmvc学习笔记(3)-注解的处理器映射器和适配器 标签: springmvc [TOC] 本文主要介绍注解的处理器映射器和适配器相关配置 默认加载 前端控制器从件中加载处理器映射器、适配器、视图解析...

brianway
2016/03/09
124
0
ECharts的Java注解框架--EChartsAnnotation

ECharts的Java注解框架:用原生Java注解来映射ECharts的Option类,提供Annotation到JSON的转换功能。 思路 How it works 在后台使用Annotation来标注Bean类 注解处理器转换成JSON树 使用JSO...

黄枣颖
2016/03/08
1K
1
深入理解Java:注解(Annotation)--注解处理器

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

长平狐
2013/06/17
87
0
zaoying/EChartsAnnotation

ECharts的Java注解框架 EChartsAnnotation 用原生Java注解来映射ECharts的类,提供Annotation到的转换功能。 思路 How it works 在后台使用Annotation来标注Bean类 注解处理器转换成JSON树 ...

zaoying
2016/03/01
0
0

<mvc:annotation-driven >和context:component-scan的区别 为啥要说这两个注解的区别,因为<mvc:annotation-driven >和context:component-scan放置的位置出错,可能就会导致项目出现404的错误......

小车车
2016/07/07
38
0
Spring核心——官配后置处理器

实际上Ioc容器中的大量功能都是通过后置处理器实现的,这里介绍几个主要的处理器。 RequiredAnnotationBeanPostProcessor RequiredAnnotationBeanPostProcessor它用于处理@Required注解。当我...

随风溜达的向日葵
07/06
0
0
Java深度历险:Java注解

在开发Java程序,尤其是Java EE应用的时候,总是免不了与各种配置文件打交道。以Java EE中典型的S(pring)S(truts)H(ibernate)架构来说,Spring、Struts和Hibernate这三个框架都有自己的 XML格...

李长春
2012/02/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python -re模块及正则表达式解析

传送门: https://blog.csdn.net/pipisorry/article/details/25909899 ps:上面文章中"命名分组"的语法格式不能执行。正确的如下: (?P<name>正则表达式) #name是一个合法的标识符...

一口今心
7分钟前
0
0
mybatis中session.getMapper方法源码分析

0开始代码AuthorMapper mapper = session.getMapper(AuthorMapper.class); 1 DefaultSqlSession类 @Override public <T> T getMapper(Class<T> type) { //最后会去调用MapperRegistry.getMap......

writeademo
15分钟前
0
0
spring cloud zuul网关的作用

zuul一般有两大作用,1是类似于Nginx的网址重定向,但zuul的重定向的一般是整个spring cloud里在Eureka注册中心的模块. zuul: ignored-services: '*' sensitiveHeaders: routes: ...

算法之名
15分钟前
8
0
java按比例之原图生成缩略图

package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; import sun.......

恋码之子
25分钟前
1
0
SpringCloud 微服务 (十五) 服务容错 Hystrix

壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应 有A服务调用B服务,B服...

___大侠
27分钟前
0
0
Spring框架中的设计模式(五)

Spring框架中的设计模式(五) 通过以前的4篇文章,我们看到Spring采用了大量的关于创建和结构方面的设计模式。本文将描述属于行为方面的两种设计模式:命令和访问者。 前传: Spring框架中的...

瑞查德-Jack
30分钟前
0
0
解决phpstorm运行很卡问题!

phpStorm一旦达到这个临界值,所有智能提示、自动补全都失效了 这TM就很尴尬了,顿时感觉自己就是个废人了,纯手写代码跟便秘一样 众所周知phpStorm基于JAVA,那么这个内存限制肯定跟JAVA的虚...

sjcehui2010
33分钟前
0
0
javascript前端AES加密解密

参考了一下网上的代码加上自已的一些想法,修改,key也可以是中文, 要引入一个aes.js的js文件。 html代码 <html> <head> <title>AES加解密</title> <meta http-equiv="Content-Type"......

oisan_
36分钟前
0
0
MacOS和Linux内核的区别

有些人可能认为MacOS和Linux内核有相似之处,因为它们可以处理类似的命令和类似的软件。甚至有人认为苹果的MacOS是基于linux的。事实上,这两个内核的历史和特性是非常不同的。今天,我们来看...

六库科技
41分钟前
0
0
Vue.js-自定义事件例子

自定义组件的 v-model 2.2.0+ 新增 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。m...

tianyawhl
44分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部