本文介绍了java的自定义注解及注解类编写的规则, 并通过实例来说明下如何使用java的注解. 实例演示了注解在类,构造方法,方法和字段的使用. 可以从这里下载到完成的工程代码: http://dl.iteye.com/topics/download/f74972df-234f-30c9-aadd-ca2ed1376bc2

自定义注解类编写的一些规则:

1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.

2. 参数成员只能用public或默认(default)这两个访问权修饰

3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.

4. 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法

5. 注解也可以没有定义成员, 不过这样注解就没啥用了

自定义注解类时, 可以指定目标 (类、方法、字段, 构造函数等) , 注解的生命周期(运行时,class文件或者源码中有效), 是否将注解包含在javadoc中及是否允许子类继承父类中的注解, 具体如下:

1. @Target 表示该注解目标,可能的 ElemenetType 参数包括:

ElemenetType.CONSTRUCTOR 构造器声明
ElemenetType.FIELD 域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE 局部变量声明
ElemenetType.METHOD 方法声明
ElemenetType.PACKAGE 包声明
ElemenetType.PARAMETER 参数声明
ElemenetType.TYPE 类,接口(包括注解类型)或enum声明

2. @Retention 表示该注解的生命周期,可选的 RetentionPolicy 参数包括

RetentionPolicy.SOURCE 注解将被编译器丢弃
RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息

3. @Documented 指示将此注解包含在 javadoc 中

4.  @Inherited 指示允许子类继承父类中的注解

好, 该介绍的介绍了, 看下自定义的注解应用实例:

1. 首先看下定义的注解类:

类注解定义, MyClassAnnotation.java:

package  com.ross.annotation;
import java.lang.annotation.*;
/**
* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
* Date: 2012-1-29
* Since: MyJavaExpert v1.0
* Description: class annotation
*/
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.TYPE)
public @interface MyClassAnnotation
{
String uri();
String desc();
}

默认构造方法注解定义,MyConstructorAnnotation.java:

package  com.ross.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
* Date: 2012-1-29
* Since: MyJavaExpert v1.0
* Description: Constructor annotation
*/
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.CONSTRUCTOR)
public @interface MyConstructorAnnotation
{
String uri();
String desc();
}

方法注解定义,MyMethodAnnotation.java:

package  com.ross.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
* Date: 2012-1-29
* Since: MyJavaExpert v1.0
* Description: method annotation
*/
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.METHOD)
public @interface MyMethodAnnotation
{
String uri();
String desc();
}

字段注解定义, MyFieldAnnotation.java:

package  com.ross.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
* Date: 2012-1-29
* Since: MyJavaExpert v1.0
* Description: field annotation
*/
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.FIELD)
public @interface MyFieldAnnotation
{
String uri();
String desc();
}

2. 再看下我们注解的应用和测试 MySample.java:

在类上面使用了MyClassAnnotation注解, 默认构造方法上使用了MyConstructorAnnotation注解,  自定义方法上使用了MyMethodAnnotation注解, 自定义字段上使用了MyFieldAnnotation注解, 在Mail函数中则实现了访问这些注解,并打印注解信息.

package  com.ross.annotation;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; import com.myinterface.MyClassAnnotation;
import com.myinterface.MyConstructorAnnotation;
import com.myinterface.MyFieldAnnotation;
import com.myinterface.MyMethodAnnotation; /**
* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com Date: 2012-1-29 Since:
* MyJavaExpert v1.0 Description: This class is used to show how to use the
* annotation of each level
*/
@MyClassAnnotation(uri = "com.ross.MySample", desc = "The class name")
public class MySample {
@MyFieldAnnotation(uri = "com.ross.MySample#id", desc = "The class field")
public String id; /**
* Description: default constructor
*/
@MyConstructorAnnotation(uri = "com.ross.MySample#MySample", desc = "The default constuctor")
public MySample() {
} /**
* Description: normal method
*/
@MyMethodAnnotation(uri = "com.ross.MySample#setId", desc = "The class method")
public void setId(String id) {
this.id = id;
} /**
* Description: MyAnnotation test
*
* @throws NoSuchMethodException
* @throws SecurityException
* @throws NoSuchFieldException
*/
public static void main(String[] args) throws SecurityException, NoSuchMethodException, NoSuchFieldException {
MySample oMySample = new MySample();
// get class annotation
MyClassAnnotation oMyAnnotation = MySample.class.getAnnotation(MyClassAnnotation.class);
System.out.println("Class's uri: " + oMyAnnotation.uri() + "; desc: " + oMyAnnotation.desc()); // get constructor annotation
Constructor oConstructor = oMySample.getClass().getConstructor();
MyConstructorAnnotation oMyConstructorAnnotation = (MyConstructorAnnotation) oConstructor.getAnnotation(MyConstructorAnnotation.class);
System.out.println("Constructor's uri: " + oMyConstructorAnnotation.uri() + "; desc: " + oMyConstructorAnnotation.desc()); // get method annotation
Method oMethod = oMySample.getClass().getDeclaredMethod("setId", String.class);
MyMethodAnnotation oMyMethodAnnotation = oMethod.getAnnotation(MyMethodAnnotation.class);
System.out.println("Method's uri: " + oMyMethodAnnotation.uri() + "; desc: " + oMyMethodAnnotation.desc()); //use method reflect
oMethod.invoke(sMySample); // get field annotation
Field oField = oMySample.getClass().getDeclaredField("id");
MyFieldAnnotation oMyFieldAnnotation = oField.getAnnotation(MyFieldAnnotation.class);
System.out.println("Field's uri: " + oMyFieldAnnotation.uri() + "; desc: " + oMyFieldAnnotation.desc()); } }

控制台打印结果:

Class's uri: com.ross.MySample; desc: The class name
Constructor's uri: com.ross.MySample#MySample; desc: The default constuctor
Method's uri: com.ross.MySample#setId; desc: The class method
Field's uri: com.ross.MySample#id; desc: The class field

至此本实例就完成了, 其实就是抓住两点一个是定义注解类,另外一个是如何访问注解, 就算是学会了.

完全引用自:

Java注解应用实例 - Annotation, 自定义注解, 注解类规则--http://hejiangtao.iteye.com/blog/1381225

va注解应用实例 - Annotation, 自定义注解, 注解类规则【转】的更多相关文章

  1. Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  2. Android中的自定义注解(反射实现-运行时注解)

    预备知识: Java注解基础 Java反射原理 Java动态代理 一.布局文件的注解 我们在Android开发的时候,总是会写到setContentView方法,为了避免每次都写重复的代码,我们需要使 ...

  3. SpringBoot自定义Condition注解

        最近碰到个这样的需求,需要同一套代码适配个版本数据库(数据库不同,且部分表的字段及关联关系可能会不同),即这套代码配置不同的数据库都能跑.项目采用的框架为SpringBoot+Mybatis. ...

  4. 自定义ConditionalOnXX注解

    一.Conditional注解介绍 对SpringBoot有足够了解的小伙伴应该都用过Conditional系列注解,该注解可用在类或者方法上用于控制Bean的初始化. 常用的Conditional注 ...

  5. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  6. Java的自定义注解使用实例

    概念 Java有五个元注解,自动继承java.lang.annotation.Annotation. 什么是元注解,可以理解为其他普通注解进行解释说明 @Target  该注解的使用范围,限定应用场景 ...

  7. Java 自定义注解与注解解析实例

    在学习Java之后会遇到很多的注解,有加载JavaBean的注解:@Component,@Service,@Controller:有获取配置文件中数值的注解@Value:有获取Http请求的数据的注解 ...

  8. Java Annotation自定义注解详解

    在开发过程中总能用到注解,但是从来没有自己定义过注解.最近赋闲在家,研究整理了一番,力求知其然知其所以然. 本文会尝试描述什么是注解,以及通过一个Demo来说明如何在程序中自定义注解.Demo没有实际 ...

  9. 使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句

    这次给大家介绍一下在Java开发过程中 使用自定义注解开发:主要知识点:            1.反射            主要用于提取注解信息            2.自定义异常  主要是为了 ...

随机推荐

  1. LeetCode算法题-Construct the Rectangle(Java实现)

    这是悦乐书的第243次更新,第256篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第110题(顺位题号是492).对于Web开发人员,了解如何设计网页的大小非常重要.因此 ...

  2. FutureTask并发详解,通俗易懂

    最近做项目,使用到了FutureTask和主线程并发,应用到实际中还是挺实用的,特在此总结一下. 有不对之处,忘各位多多指出. package com.demo; import java.util.c ...

  3. vue2.0阻止事件冒泡

    <!--picker弹窗--><transition name="fade"> <div class="picker_wrap" ...

  4. Unknown column 'user_uid' in 'field list' sql错误解决过程

    在idea中运行一直有错,找了好多个地方都找不到,以为是我的字段名字写错了,然而都是对的. 把错误的这个字段删了再打一遍就好了,

  5. redis分页摘抄

    Redis 笔记与总结8 PHP + Redis 信息管理系统(分页+好友关注) 分页 要对列表页进行分页,需要知道: ①用户总数 $count ② 页大小 $pageSize:用户自定义 ③ 当前页 ...

  6. 【Git】+安装+使用+配置

    Git安装及使用: https://www.cnblogs.com/ximiaomiao/p/7140456.html Git下载地址: http://git-scm.com/download/win ...

  7. Set.js--创建无重复值的无序集合

    Set 集合,不同于 Array,是一种没有重复值的集合. 以下代码出自于<JavaScript 权威指南(第六版)>P217,注意:这里并不是指 es6 / es2015 中的 Set ...

  8. VSCode 必装的 10 个高效开发插件

    本文介绍了目前前端开发最受欢迎的开发工具 VSCode 必装的 10 个开发插件,用于大大提高软件开发的效率. VSCode 的基本使用可以参考我的原创视频教程「VSCode 高效开发必装插件」. V ...

  9. flask(二)之Jinja2模板与Flask-WTF

    01-文档 官方文档:http://docs.jinkan.org/docs/jinja2/ 02-基本语义 Jinja2做构成的模板文件中,文本内容大致可以分成几个种类.比如特殊文本(不进行转义,比 ...

  10. 数据库优化-mysql中INNODB和MYIASM引擎的区别

    Innodb引擎 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别. 该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQ ...