`
seawenzhu
  • 浏览: 15807 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java注解学习笔记

阅读更多
一、什么是java注解
         注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的。
         Java注解又叫java标注,java提供了一套机制,使得我们可以对方法、类、参数、包、域以及变量等添加标准(即附上某些信息)。且在以后某个时段通过反射将标注的信息提取出来以供使用。
二、自定义Java标注
1  为什么要自定义注解
         Java从1.5版本以后默认内置三个标注:
Ø @Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
Ø @Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
Ø @SuppressWarnings:这一个类型可以来暂时把一些警告信息消息关闭.
但是,仅仅这三个标注是不能满足我们开发时一些需求的。所以java允许我们自定义注解来使用。
2  如何自定义注解
自定义步骤大致分为两步:
1,              通过@interface关键字(注意,不是interface,是@interace)声明注解名称,以及注解的成员属性或者叫做注解的参数。
2,              使用java内置的四个元注解对这个自定义标注的功能和范围进行一些限制
问题来了,什么是元注解?
3  什么是元注解
元注解,就是定义注解的注解,也就是说这些元注解是的作用就是专门用来约束其它注解的注解。请区别上面那三个注解,他们也是通过元注解定义而来的。
元注解有哪些呢,主要有四个@Target,@Retention,@Documented,@Inherited?
1.  * 元注解有:@Target,@Retention,@Documented,@Inherited
2.  * 
3.  *     @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括:
4.  *         ElemenetType.CONSTRUCTOR 构造器声明
5.  *         ElemenetType.FIELD 域声明(包括 enum 实例)
6.  *         ElemenetType.LOCAL_VARIABLE 局部变量声明
7.  *         ElemenetType.METHOD 方法声明
8.  *         ElemenetType.PACKAGE 包声明
9.  *         ElemenetType.PARAMETER 参数声明
10. *         ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
11. *         
12. *     @Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
13. *         RetentionPolicy.SOURCE 注解将被编译器丢弃
14. *         RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
15. *         RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
16. *         
17. *     @Documented 将此注解包含在 javadoc 中
18. *     
19. *     @Inherited 允许子类继承父类中的注解

4 自定义及使用注解示例
         自定义一个类级别的标注Description
package lighter.javaeye.com;
   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;

   @Target(ElementType.TYPE)//这个标注应用于类
   @Retention(RetentionPolicy.RUNTIME)//标注会一直保留到运行时
   @Documented//将此注解包含在javadoc中
   public @interface Description {
       String value();
   }

         再定义个方法级别的注解Name
   package lighter.javaeye.com;
   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;

    //注意这里的@Target与@Description里的不同,参数成员也不同
   @Target(ElementType.METHOD)
   @Retention(RetentionPolicy.RUNTIME)
   @Documented
   public @interface Name {
       String originate();
       String community();
   }

         然后使用以上两个注解
package lighter.javaeye.com;

@Description(value="javaeye,做最棒的软件开发交流社区")
public class JavaEyer {
         @Name(originate="创始人:robbin",community="javaEye")
         public String getName()
         {
                   return null;
         }
       
         @Name(originate="创始人:江南白衣",community="springside")
         public String getName2()
         {
                   return "借用两位的id一用,写这一个例子,请见谅!";
         }
}

说明:其中标注“@Description(value="javaeye,做最棒的软件开发交流社区")”,可以写成“@Description("javaeye,做最棒的软件开发交流社区") ”,结果也是一样的。因为Description标注定义的时候其参数(或者说属性)为value。而value比较特殊,它在被指定参数的时候可以不用显示的写出来。当然如果定义的时候参数名不是value而是其它的比如des,那么使用注解的时候,必须显示写出参数名,然后再赋值:@Description(Des=”xxx”)
                                                                                                                                              

提取出注解的信息
package lighter.javaeye.com;

import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;

public class TestAnnotation {
         /**
          * author lighter
          * 说明:具体关天Annotation的API的用法请参见javaDoc文档
          */
       public static void main(String[] args) throws Exception {
       String CLASS_NAME = "lighter.javaeye.com.JavaEyer";
       Class test = Class.forName(CLASS_NAME);
       Method[] method = test.getMethods();
       boolean flag = test.isAnnotationPresent(Description.class);
        if(flag)
        {
                 Description des = (Description)test.getAnnotation(Description.class);
                 System.out.println("描述:"+des.value());
                 System.out.println("-----------------");
        }
      
        //把JavaEyer这一类有利用到@Name的全部方法保存到Set中去
        Set<Method> set = new HashSet<Method>();
        for(int i=0;i<method.length;i++)
        {
                 boolean otherFlag = method[i].isAnnotationPresent(Name.class);
                 if(otherFlag) set.add(method[i]);
        }
        for(Method m: set)
        {
                 Name name = m.getAnnotation(Name.class);
                 System.out.println(name.originate());
                 System.out.println("创建的社区:"+name.community());
        }
     }
}

注意事项:
所有的Annotation会自动继承java.lang.annotation这一个接口,所以不能再去继承别的类或是接口.
   最重要的一点,Annotation类型里面的参数该怎么设定:
   第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型.
   第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String.
参考资料: http://www.javaeye.com/topic/36659#
                     http://www.javaeye.com/topic/400085

本文出自 “linux要从娃娃抓起” 博客,请务必保留此出处http://wanqiufeng.blog.51cto.com/409430/458883
分享到:
评论

相关推荐

    java注解和反射的个人学习笔记

    java注解和反射的个人学习笔记

    Java入门学习笔记

    "Java入门第三季学习笔记"可能涵盖了更多高级话题,如反射、注解、设计模式和Java库的使用。反射允许程序在运行时检查类、接口、字段和方法的信息,提供了更大的灵活性。注解是一种元数据,可以用来提供编译器或运行...

    java学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    (完整版)最全的java学习笔记(必看).pdf

    Java学习笔记 Java是一种流行的编程语言,广泛应用于Android应用程序开发、Web应用程序开发、桌面应用程序开发等领域。以下是Java学习笔记的摘要信息: 一、Java技术基础 * 1.1 编程语言:Java是一种面向对象的...

    java李兴华学习笔记之Java常用类库

    ### Java李兴华学习笔记之Java常用类库 #### 一、课程介绍及知识点概览 根据提供的资料,“Java李兴华学习笔记之Java常用类库”这份文档来源于北京MLDN软件实训中心的教学资料,主要涵盖了Java编程语言中常用类库...

    java学习笔记1

    Java学习笔记1 Java学习笔记1是学习Java过程中的笔记,主要记录了Eclipse开发环境中的快捷键使用、编辑功能、查找和调试等知识点。 Eclipse快捷键 Eclipse中有许多快捷键,掌握这些快捷键可以大大提高开发效率。...

    JAVA学习笔记 林信良

    《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...

    韩顺平编写的java学习笔记(全)

    ### 韩顺平编写的Java学习笔记概览 #### Java平台分类与运行机制 - **J2SE(Java 2 Platform, Standard Edition)**: 标准版Java开发平台,适用于桌面应用程序开发。 - **J2EE(Java 2 Platform, Enterprise ...

    JAVA项目学习笔记

    【JAVA项目学习笔记】 在Java开发中,尤其是在SpringMVC框架下,我们常常会遇到各种注解的使用,这些注解极大地简化了代码并优化了性能。以下是一些关键注解的详细解释: 1. **@Basic**: 这个注解用于指定实体属性...

    Java基础尚硅谷宋红康学习笔记

    【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。

    java超强学习笔记

    "Java超强学习笔记"显然是一份全面且深入的Java学习资料,由一位极具洞察力和组织能力的作者精心编纂。这份笔记可能包含了从基础知识到高级特性的全方位讲解,旨在帮助学习者构建坚实的Java编程基础,并提升他们的...

    瑜琅java学习笔记

    ### 瑜琅Java学习笔记概览 瑜琅的Java学习笔记涵盖了Java的基础概念与核心特性,从起源到高级特性均有涉及。以下是对该学习笔记各部分的深入解析: #### 1. Java起源 ##### 1.1 发展背景 - Java的诞生源于Sun ...

    Java JDK 6学习笔记——ppt简体版

    Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...

    《Java学习笔记》

    这份《Java学习笔记》包含了丰富的知识内容,旨在帮助学习者全面掌握Java编程技术。笔记分为7个PDF部分,覆盖了从基础到高级的Java编程概念。 1. **Java基础知识**:这部分内容通常包括Java的历史背景、环境配置、...

    java学习笔记(全)

    Java学习笔记全集是针对Java编程语言的一份详尽的学习资料,它涵盖了从基础到进阶的各个层面,旨在帮助初学者系统地学习Java,并为有一定经验的开发者提供复习和巩固知识的平台。这份笔记主要关注Java语言的核心概念...

    毕向东java经典学习笔记word版

    【毕向东Java经典学习笔记Word版】是一份深入讲解Java编程语言的学习资料,由知名IT教育专家毕向东编撰。这份笔记以其系统性、实践性和深度广度深受Java初学者和进阶者的喜爱。毕向东作为Java教育领域的权威人士,他...

    Java学习笔记(整理)

    这份“Java学习笔记”是为初学者准备的,旨在帮助他们快速掌握Java的基础知识。笔记中可能涵盖了以下重要知识点: 1. **Java简介**:Java是由Sun Microsystems(现已被Oracle收购)开发的,它的设计目标是“一次...

    Java JDK 5.0学习笔记

    本学习笔记旨在帮助新手全面理解并掌握Java 5.0的关键知识点。 一、泛型(Generics) Java 5.0引入了泛型,它允许在定义类、接口和方法时指定类型参数,从而实现类型安全的集合。泛型消除了强制类型转换的需要,...

    java学习笔记总结.doc

    这篇文档是个人的Java学习笔记总结,旨在帮助0基础的学习者从零开始掌握Java基础知识,并逐步成为专业的Java开发者。以下是笔记中涉及的一些关键知识点: 1. **Java开发环境的设置**: 要开始Java编程,首先需要...

Global site tag (gtag.js) - Google Analytics