注解(Annotation)是从jdk1.5开始增加的特性。学习注解能够读懂框架的代码;让编程更加简洁,代码更加清晰。

注解概念:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法。
注解需要import java.lang.annotation.*;

java自带的3个注解:

  •   @Override//覆盖
  •   @Deprecated//过时
  •   @SuppressWarnings()//抑制警告

自定义注解的语法要求
  一般自定义注解的代码如下://“Description 注解”在下面的栗子中会用到哦O(∩_∩)O
  @Target({ElementType.METHOD,ElementType.TYPE})//作用域是在方法上、类或者接口上。
  @Retention(RetentionPolicy.RUNTIME)
  @Inherited//允许子类继承(你给某个父类注解了,子类会继承父类的注解)
  @Documented//生成doc时会包含注解的信息
  public @interface Description {//使用@interface关键字定义注解
    String desc();//成员以无参无异常方式声明
    String author();
    int age() default 18;//可以用default为成员制定一个默认值
  }

讲解:
元注解,就是注解的注解,@Target, @Retention, @Inherited, @Documented都是元注解。

@Target的取值有:

  1. ElementType.TYPE //接口、类、枚举、注解
  2. ElementType.FIELD/字段、枚举的常量
  3. ElementType.METHOD//方法
  4. ElementType.PARAMETER//方法参数
  5. ElementType.CONSTRUCTOR//构造函数
  6. ElementType.LOCAL_VARIABLE//局部变量
  7. ElementType.ANNOTATION_TYPE//注解
  8. ElementType.PACKAGE///包
 

Retention:保留,定义注解的保留策略。有3个值:SOURCE、CLASS、RUNTIME。

  • SOURCE只在源码显示,编译时会丢弃。
  • CLASS编译时会记录到class中,运行时忽略。
  • RUNTIME运行时存在,可以通过反射读取。在执行main方法就是运行时。

成员类型是受限的,合法的类型包括原始类型及String,Class,Annotation, Enumeration。
当注解只有一个成员时,成员名必须取名为value(),因为约定俗成,我们可以不用写参数名和赋值号。直接给参数值。简洁方便。允许你偷看下面的注解类MyDescription。
注解类可以没有成员,没有成员的注解称为标识注解。如SpringMVC里面的@Controller,就是标识注解。

解析注解:通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。

 package com.rainmer.anno;

 import java.lang.annotation.*;

 /**
* Created by Simon Sun on 2015/7/22.
*/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface MyDescription {
public String value();
}
 package com.rainmer.anno;

 /**
* Created by Simon Sun on 2015/7/22.
*/
@MyDescription("i am interface")
public interface Person {
@MyDescription("i am interface method")
public String name();
public int age();
public void sing();
}
 package com.rainmer.anno;

 /**
* Created by Simon Sun on 2015/7/22.
*/
@MyDescription("i am a class annotation")
public class Child implements Person {
@Override
@MyDescription("i am a method annotation")
@Description(desc = "the name method",author = "mook boy")
public String name() {
return null;
} @Override
public int age() {
return 0;
} @Override
public void sing() { }
}
 package com.rainmer.anno;

 import java.lang.annotation.Annotation;
import java.lang.reflect.Method; /**
* Created by Simon Sun on 2015/7/22.
*/
public class ParseAnno {
public static void main(String[] args) {
//1、使用类加载器加载类
try {
Class c = Class.forName("com.rainmer.anno.Child");
//判断雷尚是否有MyDescription这样的注解
boolean isExist = c.isAnnotationPresent(MyDescription.class);
if(isExist){
//3、拿到注解实例
MyDescription myDescription = (MyDescription) c.getAnnotation(MyDescription.class);
System.out.println(myDescription.value());
} //4、找到方法上的注解
Method[] ms = c.getMethods();
for(Method m : ms){
boolean isMExist = m.isAnnotationPresent(MyDescription.class);
if(isMExist){
MyDescription d = m.getAnnotation(MyDescription.class);
System.out.println(d.value());
}
} //另外一种解析方法
for(Method m : ms){
Annotation[] as = m.getAnnotations();
for(Annotation a : as){
if(a instanceof MyDescription){
MyDescription d = (MyDescription) a;
System.out.println(d.value());
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} }
}

程序输出:

i am a class annotation

i am a method annotation
i am a method annotation

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

继承的时候不仅会继承类的注解,也会继承方法的注解,前提是子类不覆盖父类的方法。

来个栗子:

 package com.rainmer.anno;

 /**
* Created by Simon Sun on 2015/7/22.
*/
@MyDescription("i am parent class")
public class Animal {
@MyDescription("i am parent method")
public String getName(){
return null;
};
}
 package com.rainmer.anno;

 /**
* Created by Simon Sun on 2015/7/22.
*/
public class Dog extends Animal { }

解析类ParseAnno只要修改第13行为:Class c = Class.forName("com.rainmer.anno.Dog");即可。

程序输出:

i am parent class
i am parent method
i am parent method

但是如果Dog覆盖了getName方法,那么输出就变成:

i am parent class

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

最后加点调料,idea的两个实用快捷键:

alt+回车:add exception或者快速try/catch;强制类型转换 。
alt+insert:生成代码,如get、set方法,构造函数等,当然,还可以用来快速覆盖接口或父类的方法

源码下载:http://yunpan.cn/ccWaszMAARdJb  访问密码 d806

java注解入门(含源码下载)的更多相关文章

  1. C++ JsonCpp 使用(含源码下载)

    C++ JsonCpp 使用(含源码下载) 前言 JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择JSON的全称为:JavaScri ...

  2. C++ TinyXml操作(含源码下载)

      前言 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手.这个解析库的模型通过解析X ...

  3. 【C/C++开发】TinyXml操作(含源码下载)

    前言 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手. 这个解析库的模型通过解析XM ...

  4. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  5. JAVA上百实例源码网站

    JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ...

  6. arcgis api 3.x for js 入门开发系列批量叠加 zip 压缩 SHP 图层优化篇(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  7. openlayers4 入门开发系列之地图导航控件篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  8. Thinking in java源码下载链接

    Thinking in java书上显示的下载源码到www.mindview.net站点,但是这个站点打不开了,后来找到真正的下载地址,贴于此. http://www.mindviewinc.com/ ...

  9. openlayers4 入门开发系列结合 echarts4 实现散点图(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

随机推荐

  1. 【转】android权限列表

    访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permiss ...

  2. 快速的CDN加速服务

    jQuery Migrate jQuery官网CDN地址jQuery版本迁移辅助插件,用jquery不同版本开发的程序在修改jquery版本出现的兼容问题可以使用jQuery Migrate解决此问题 ...

  3. HDU 5919 Sequence II(可持久化线段树)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...

  4. 理解Android的layout和measure

    在Android UI开发中,总会有情况需要自定义View和View Group. 什么是View?就是Android中一个基本视图单位,一个Button是一个view, 一个Layout, 也是一个 ...

  5. Linux系统源码安装过程中的prefix选项

    在linux和unix环境中,源码安装是最常用的软件安装方式,一些软件除了提供源码外,也提供各种发行版的二进制安装包(如基于redhat包管理工具的rpm包),但强烈建议使用源码安装方式.原因是:(1 ...

  6. SQL Server索引进阶:第七级,过滤的索引

    原文地址: Stairway to SQL Server Indexes: Level 7,Filtered Indexes 本文是SQL Server索引进阶系列(Stairway to SQL S ...

  7. [Jobdu] 题目1517:链表中倒数第k个结点

    给出一个链表的头指针,要求找到倒数第k个节点,并输出这个节点的值 例子: 先看一个例子,链表为:1 2 3 4 5 6,倒数第2个节点就是5,倒数第一个节点就是6,以此类推.这里的链表有头节点,就是说 ...

  8. BZOJ 1083: [SCOI2005]繁忙的都市(MST)

    裸的最小生成树..直接跑就行了 ---------------------------------------------------------------------- #include<c ...

  9. java 读文件 解析

    [Java]读取文件方法大全   1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile {     /**     ...

  10. bzoj 1295: [SCOI2009]最长距离

    题目链接 1295: [SCOI2009]最长距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1165  Solved: 619[Submit][ ...