java注解入门(含源码下载)
注解(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的取值有:
- ElementType.TYPE //接口、类、枚举、注解
- ElementType.FIELD/字段、枚举的常量
- ElementType.METHOD//方法
- ElementType.PARAMETER//方法参数
- ElementType.CONSTRUCTOR//构造函数
- ElementType.LOCAL_VARIABLE//局部变量
- ElementType.ANNOTATION_TYPE//注解
- 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注解入门(含源码下载)的更多相关文章
- C++ JsonCpp 使用(含源码下载)
C++ JsonCpp 使用(含源码下载) 前言 JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择JSON的全称为:JavaScri ...
- C++ TinyXml操作(含源码下载)
前言 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手.这个解析库的模型通过解析X ...
- 【C/C++开发】TinyXml操作(含源码下载)
前言 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手. 这个解析库的模型通过解析XM ...
- JAVA上百实例源码以及开源项目
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...
- JAVA上百实例源码网站
JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ...
- arcgis api 3.x for js 入门开发系列批量叠加 zip 压缩 SHP 图层优化篇(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- openlayers4 入门开发系列之地图导航控件篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- Thinking in java源码下载链接
Thinking in java书上显示的下载源码到www.mindview.net站点,但是这个站点打不开了,后来找到真正的下载地址,贴于此. http://www.mindviewinc.com/ ...
- openlayers4 入门开发系列结合 echarts4 实现散点图(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
随机推荐
- halcon与C#混合编程进阶版
这篇主要是C#和Halcon的混合编程,在此基础上对按键不同功能的划分,以及图片适应窗口和从本地打开图片. 新手来这里:http://www.cnblogs.com/badguy518/p/55150 ...
- 【算法】计算一篇文章的单词数(C、Java语言实现)
1. C语言:一个字符一个字符的读取 (有空再贴出来) 2.Java语言:按行读取,并用正则分割成多个单词,再用MapReduce并行计算单词数 (我使用的是ieda,有些地方跟eclipse有点区别 ...
- fiddler--firefiox代理
修改端口:修改后重启才能生效
- Mysql innodb 后台的7大线程与3大内存
A:一个master 线程(innodb 几乎在这个线程上实现有所有功能) B:一个lock 监控线程 C:一个错误监控线程 D:四个IO线程(insert buffer thread\log thr ...
- 自己模拟实现math.h中的函数
之前一直都很迷惑pow()函数时怎么实现的,对于整数次的幂我还能很容易做到,但是对于分数次幂就不是那么好做了.需要一些高等数学级数的知识. 我这里实现了求ln(x), pow(double x, do ...
- 如何从 0 开始学 ruby on rails (漫步版)
如何从 0 开始学 ruby on rails (漫步版) ruby 是一门编程语言,ruby on rails 是 ruby 的一个 web 框架,简称 rails. 有很多人对 rails 感兴 ...
- 多版本jQuery的使用剖析
</div> </div> <!-- basic scripts --> <!--[if !IE]> --> <!-- <![endi ...
- 基于ZooKeeper的Dubbo简单抽样登记中心
一:设备zookeeper 系统环境 Ubuntu 14.04.2 LTS x64 IP : 192.168.1.102 下载zookeeper-3.4.6.tar.gz到文件夹/opt.拉开拉链 m ...
- zoj 1453 Stripies
/* 根据题意:不难看出,要是整个方程式最小,那么应该大的数先结合,小的数后结合.先排序然后结合(贪心) */ #include<stdio.h> #include<stdlib.h ...
- 面试题之请写出用于校验 HTML 文本框中输入的内容全部为数字 的 javascript 代码
<input type="text" id="d1" onblur=" chkNumber(this)"/> <scrip ...