关闭

[置顶] Java注解的实现与使用

标签: java注解
3177人阅读 评论(3) 收藏 举报
分类:

Java注解是java5版本发布的,其作用就是节省配置文件,增强代码可读性。在如今各种框架及开发中非常常见,特此说明一下。

如何创建一个注解
每一个自定义的注解都由四个元注解组成,这四个元注解由java本身提供:
@Target(ElementType.**)
这是一个枚举,它置顶是该自定义的注解使用的地方,像类、变量、方法等
@Retention(RetentionPolicy.**)作用是标明注解保存在什么级别,像在编译时、class文件中,vm运行中
@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同
@Inherited : 在您定义注解后并使用于程序代码上时,预设上父类别中的注解并不会被继承至子类别中,您可以在定义注解时加上java.lang.annotation.Inherited 限定的Annotation,这让您定义的Annotation型别被继承下来。

介绍完理论,开始代码(talk is cheap,show your code)

package com.yasin.JavaLearn;

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;

/**
 * 这是一个类级别的注释,这个注释中有一个name字段,默认值是  yasin
 * @author yasin
 *
 */

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Learn {
    String name() default "yasin";
}
package com.yasin.JavaLearn;

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;

/**
 * 这是一个变量级别的注解,注解中有一个字段name,默认值是field
 * @author yasin
 *
 */

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FiledLearn {
    String name() default "field";


}
package com.yasin.JavaLearn;

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;

/**
 * 这是一个方法级别的注解
 * @author yasin
 *
 */

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodLearn {
    String name() default "method";

}

上面了我定义了三个注解,分别是常用的类、变量、方法三个级别的注解。
下面我定义一个类,使用这三个注解

package com.yasin.JavaLearn;

@Learn
public class Yasin {

    @FiledLearn
    public int level;

    @FiledLearn(name="xq")
    public String xq;

    public String a;


    @MethodLearn(name="test")
    public void setMain(){

    }

    public void setA(){

    }

}

下面就是如何使用这个注解了,注解的提取,都是通过class反射得到相应的变量和方法,在从变量和方法中获得注解。

package com.yasin.JavaLearn;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;

/**
 * Hello world!
 *
 */
public class App {

    public static void main(String[] args) {

        Learn learn = Yasin.class.getAnnotation(Learn.class);
        System.out.println(learn.name());


        Field[] fields = Yasin.class.getFields();//获取该类所有的字段

        for(Field filed:fields){
            if(filed.isAnnotationPresent(FiledLearn.class)){//校验该字段是否添加这个注解
                System.out.println(filed.getName());
                FiledLearn filedLearn = filed.getAnnotation(FiledLearn.class);
                System.out.println(filedLearn.name());
            }
        }

        Method[] methods = Yasin.class.getMethods();
        for(Method method:methods){
            if(method.isAnnotationPresent(MethodLearn.class)){//校验该方法是否有这个注解
                System.out.println(method.getName());
                MethodLearn methodLearn = method.getAnnotation(MethodLearn.class);
                System.out.println(methodLearn.name());
            }

        }


    }
}
3
1
查看评论

java注解:如何实现和使用一个自定义注解?

java中注解在java中的应用非常广泛,如override、supperwarning等等注解,框架中的注解应用更为广泛,主流框架基本都有自己的注解体系,今天想总结和学习一下注解的相关知识,第一篇将介绍如何实现一个注解,第二篇将介绍如何应用一个注解。1,注解有什么用? 注解的作用基本有三个: ...
  • wangpengzhi19891223
  • wangpengzhi19891223
  • 2017-09-29 10:10
  • 709

注解与装饰器的点点滴滴

注解与装饰器的点点滴滴 对于很多 Java 开发人员来说,注解(Annotation)已经是一个十分熟悉的概念。而在 JavaScript 中(目前仍然是 Stage 2 的 ES Proposal),引入了一个类似的语法——装饰器(Decorator)。 甚至有很多人在生活中不加区分两个的概念,把...
  • 5hongbing
  • 5hongbing
  • 2017-08-12 23:08
  • 247

Java注解处理之反射API

java.lang.reflect 包下主要包含一些实现反射功能的工具类,实际上,java.lang.reflect 包所有提供的反射API扩充了读取运行时Annotation信息的能力。当一个Annotation类型被定义为运行时的Annotation后,该注解才能是运行时可见,当class文件被...
  • liuxigiant
  • liuxigiant
  • 2017-01-09 23:23
  • 676

基于注解和反射的Java ORM框架(1)-通过注解描述映射关系

一,ORM概念ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关系。现在常见的ORM框架比如Hibernate和mybatis,都是采用了ORM的方式,基本原则就是类...
  • woshisangsang
  • woshisangsang
  • 2017-03-13 14:09
  • 1267

【Annotation】使用自定义注解实现依赖注入

使用自定义注解实现依赖注入个人理解为使用注解和反射机制获取和传递对象参数,从而降低类之间的耦合。具体案例如下:
  • Spixii
  • Spixii
  • 2016-09-13 20:18
  • 1657

Python 中的类装饰器 类似于JAVA中的annotation

来源:http://www.fanjun.me/?p=568#encoding=utf8#http://www.fanjun.me/?p=568_missing = Noneclass cached_property(object):    def __init__(self, ...
  • bjbs_270
  • bjbs_270
  • 2014-02-12 17:54
  • 3894

java中注解的原理和实现机制

java中注解的实现原理和机制 一.什么是注解:      注解是标记,也可以理解成是一种应用在类、方法、参数、属性、构造器上的特殊修饰符。注解作用有以下三种:        第一种:生成文档,常用的有@param@return等...
  • shuaipu813
  • shuaipu813
  • 2016-10-14 17:57
  • 4826

基于spring注解切面的简单实现

首先定义一个注解:package com.permission.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation...
  • CSDN_niuniu
  • CSDN_niuniu
  • 2017-04-14 17:19
  • 2067

Java注解 和动态代理

元注解:1.@Target:作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)  取值(ElementType)有:     1.CONSTRUCTOR:用于描述构造器     2.FIELD:用于描述域     3.LOCAL_VARIABLE:用于描述局部变量     4....
  • qq_34523942
  • qq_34523942
  • 2016-10-08 17:22
  • 382

Java注解(Annotation)详解(一)——概述及JDK自带注解

(一)注解的概述 最近在学习Java注解,看了慕课网的视视频后觉得不错,但我相信一段时间后肯定会忘记,所以做做笔记。 1.何为注解?   概念:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以...
  • Zen99T
  • Zen99T
  • 2015-10-30 09:54
  • 6512
    个人资料
    • 访问:75335次
    • 积分:1327
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:1篇
    • 译文:0篇
    • 评论:31条