注解(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. python进阶3--文件系统

    文件系统 python的标准库中包括大量工具,可以处理文件系统中的文件,构造和解析文件名,也可以检查文件内容. pyhton表文件名表示为简单的字符串,另外还提供了一些工具,用来由os.path中平台 ...

  2. svn中的Trunk,branches,tags深度理解

    trunk.就是主干,这个目录以下直接放源代码了,我们创建项目的时候,把项目源代码放到这个目录.import进svn branches.就是分支,以下可能有非常多trunk,比方trunk_1_0_1 ...

  3. 线性规划问题的matlab求解

    函数:[x, fval] = linprog(f, A, b, Aeq, Beq, LB, UB) 返回的x:是一个向量——在取得目标函数最小时各个xi的取值: 返回的fval:目标函数的最小值: 参 ...

  4. POJ 3169 Layout (图论-差分约束)

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6574   Accepted: 3177 Descriptio ...

  5. HDU1250:Hat's Fibonacci

    Problem Description A Fibonacci sequence is calculated by adding the previous two members the sequen ...

  6. C#连接Oracle数据库基本类

    C#用来连接oracle数据库的基本类: using System; using System.Collections.Generic; using System.Linq; using System ...

  7. spark学习

    大数据学习纲要,主要针对spark的相关知识的学习,后续会涉及其他大数据相关框架及语言. 1 spark入门: 2.spark 实战部分 3.spark源码解析

  8. 浅谈Servlet(一)

    一.Servlet技术引言 1.什么是servlet a.Servlet(Server Applet),全称Java Servlet,未有中文译文.是用Java编写的服务器端程序.其主要功能在于交互式 ...

  9. C++时间获取

    http://net.pku.edu.cn/~yhf/linux_c/function/04.html   asctime(将时间和日期以字符串格式表示) 相关函数 time,ctime,gmtime ...

  10. mysql查询数据库中包含某字段(列名)的所有表

    SELECT TABLE_NAME '表名',TABLE_SCHEMA '数据库名',ORDINAL_POSITION '顺序',COLUMN_NAME '字段',DATA_TYPE '类型' ,CH ...