注解(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. 数组序列的capacity及size函数

    #include<iostream>#include<vector>using namespace std;int main(){    vector<int> i ...

  2. SQL Server 储存过程的output 参数

    要做的参数的回传一方面要做到有储存过程的配合,再一方面也要有调用方法的配合,也就是说错误的调用方法是没有办法把值回传的. 下面是例子 --1.储存过程方面的配合 create procedure db ...

  3. 身份验证cookies和Token

    后端服务器有两种基本的身份验证:1.是基于Cookie的身份验证,使用服务器端的cookie来对每次请求的用户进行身份验证.2. 较新的方法,基于令牌Token的认证,依赖于被发送到服务器上每个请求的 ...

  4. poj 1684 Lazy Math Instructor(字符串)

    题目链接:http://poj.org/problem?id=1686 思路分析:该问题为表达式求值问题,对于字母使用浮点数替换即可,因为输入中的数字只能是单个digit. 代码如下: #includ ...

  5. MySQL性能调优的方法

    第一种方法 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的 性能,我们可以将表中字 ...

  6. hdu 2421 Deciphering Password(约数个数问题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2421 A^B 能够写成 p1^e1 * p2^e2 * .....*pk^ek.(A.B <= 10000 ...

  7. PendingIntent详解

    Intent是一个意图,一个描述了想要启动一个Activity.Broadcast或是Service的意图.它主要持有的信息是它想要启动的组件(Activity.Broadcast或是Service) ...

  8. 获取ubuntu 的root密码,告别sudo

    刚刚开始使用ubuntu的朋友可能知道一个提权命令    sudo 如果你接触过其他的Linux系统的话,你会知道  linux系统有一个最高权限   root.一般用su root,然后输入密码就可 ...

  9. 用 rsync 同步本地和服务器的文件

    参考 DigitalOcean 安装 For Debian/Ubuntu: sudo apt-get install rsync For OpenSUSE/Fedora: sudo yum insta ...

  10. DevExpress ASP.NET 使用经验谈(5)-通过ASPxGridView实现CRUD操作

    这节,我们将通过使用DevExpress的ASPxGridView控件,实现对数据的CRUD操作. 首先,我们在解决方案中,添加一个网站: 图一 添加新网站 图二 添加DevExpress.Data. ...