JDK1.5新特性(七)……Annotations
概述
Annotations (Metadata) - This language feature lets you avoid writing boilerplate code under many circumstances by enabling tools to generate it from annotations in the source code. This leads to a "declarative" programming style where the programmer says what should be done and tools emit the code to do it. Also it eliminates the need for maintaining "side files" that must be kept up to date with changes in source files. Instead the information can be maintained inthe source file.
Annotation,即注解
所谓注解,顾名思义,就是为Java的类或者方法在添加一个带有提示功能的注释,与注释不同的是,它相当于一个接口,这个接口中定义了一些具有提示意义的方法,所以,注解的作用就是提示功能,且不影响原来代码的语法
我们也可以看到,注解的标识符为@interface,也就代表了,它是一个与接口类似的类,它的使用范围和访问性都与接口相似
标准的注解与使用
Java在lang包中提供的标准注解有以下三个
Deprcated代表被注释的元素已经过时
Override代表被注释的元素是复写了父类的实现
SuppressWarning代表被注释的元素取消编译器警告
下面就是这个三个注解的应用
1: public class SimpleAnnotationTest {
2:
3: /**
4: * @param args
5: */
6: @SuppressWarnings("Deprecation")//忽略编译器对show方法的过时警告
7: public static void main(String[] args) {
8: // TODO Auto-generated method stub
9:
10: show();
11: }
12:
13: @Deprecated//注明此方法已过时
14: public static void show(){
15: System.out.println("hello");
16: }
17:
18: @Override//复写了父类的toString方法
19: public String toString() {
20: // TODO Auto-generated method stub
21: return super.toString();
22: }
23: }
自定义注解
通过上面对注解有一些了解之后,我们发现,注解就相当于一个框架的提示,使得程序能够更好的按照框架来编写
为了更好的体现自己框架的一些特性,我们可以自定义注解
元注解
在定义注解之前,首先我们要了解一下什么是元注解
所谓元注解,就是注解的注解,也就是说有些注解是专门为注解提供注解的
比如,Override注解的定义如下
public @interface Override
其中Target与Rentention就是两种最常见的元注解
Target用来指明被注解的元素的范围,这里是方法元素
Retention用来指明被注解的元素保留时期,分别是源代码阶段(SOURCE)、字节码阶段(CLASS)、运行阶段(RUNTIME)
注解的格式
注解的标识符为@interface
注解中的成员与接口类似,比如String value();
我们可以为其制定缺省值,比如String value() default “red”;
如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。
好了,那我们来定义自己的注解
1: /**
2: * @author Shawn
3: *
4: */
5: //运行阶段的注解
6: @Retention(RetentionPolicy.RUNTIME)
7: //方法上的注解
8: @Target(ElementType.METHOD)
9: public @interface MyAnnotation {
10: //此属性表示被注解的方法使用权限
11: Limits limit() default Limits.USER;
12: }
这里的权限是自己定义的一个枚举
1: //权限
2: public enum Limits {
3: ADMIN,//Admin权限
4: USER;//user权限
5: }
注解的使用
注解的使用可以通过反射
利用反射获得注解的实例对象,通过这个对象,我们可以获取其中的属性值
1: public class AnnotationTest {
2:
3: /**
4: * @param args
5: * @throws NoSuchMethodException
6: * @throws SecurityException
7: * @throws InvocationTargetException
8: * @throws IllegalAccessException
9: * @throws IllegalArgumentException
10: */
11: public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
12:
13: //创建一个用户
14: User me = new User(Limits.USER);
15:
16: //通过反射得到方法上注解的实例对象
17: Method method = AnnotationTest.class.getMethod("show", null);
18: MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
19: //判断注解中声明的权限
20: if(annotation.limit() == Limits.USER){
21: method.invoke(me, null);
22: }
23: else{
24: System.out.println("Sorry,you don't have limits to invoke "+method.getName()+" method");
25: }
26: }
27: //注释show方法的权限
28: @MyAnnotation(limit=Limits.ADMIN)
29: public static void show(){
30: System.out.println("hello");
31: }
32: }
上面的例子就实现了一个简单的权限机制,我们可以想象,这对框架的作用是非常大的,减少了很多不必要的代码
由于注解的强大,相信不是这么简单就可以说明白的,上面只是简单介绍了一下,关于注解的进一步分析,会在今后继续讨论。。
JDK1.5新特性(七)……Annotations的更多相关文章
- jdk1.6新特性
1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...
- JDK1.5新特性,基础类库篇,集合框架(Collections)
集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...
- JDK1.7新特性
jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...
- JDK1.8 新特性
jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API https://blog.csdn.net/qq ...
- JDK1.6新特性,WebService强化
Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...
- JDK1.7新特性(2):异常和可变长参数处理
异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...
- jdk1.8新特性应用之Iterable
我们继续看lambda表达式的应用: public void urlExcuAspect(RpcController controller, Message request, RpcCallback ...
- jdk1.8新特性之方法引用
方法引用其实就是方法调用,符号是两个冒号::来表示,左边是对象或类,右边是方法.它其实就是lambda表达式的进一步简化.如果不使用lambda表达式,那么也就没必要用方法引用了.啥是lambda,参 ...
- jdk1.8新特性之lambda表达式
lambda表达式其实就是指一个匿名函数,应用最广泛的就是匿名内部类的简化.在jdk1.8之前,我们定义一个匿名内部类可能需要写一大坨代码,现在有了lambda之后,可以写的很简洁了.但不是说lamb ...
随机推荐
- Does not contain a valid host:port authority: Master:8031 (configuration property 'yarn.resourcemanager.resource-tracker.address')
问题解决: 这个错误是:yarn里面的配置的格式有错误:如: <property> <name>yarn.resourcemanager.address</name> ...
- Spring MVC与表单日期提交的问题
Spring MVC与表单日期提交的问题 spring mvc 本身并不提供日期类型的解析器,需要手工绑定, 否则会出现非法参数异常. org.springframework.beans.BeanIn ...
- PAT-乙级-1045. 快速排序(25)
1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...
- Ehcache 整合Spring 使用页面、对象缓存(转载)
Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布式缓存.如果整合Spring.Hibernate也非常的 ...
- dijkstra,bellman-ford,floyd分析比较
http://www.cnblogs.com/mengxm-lincf/archive/2012/02/11/2346288.html 其实我一直存在疑惑是什么导致dijkstra不能处理负权图? 今 ...
- MyEclipse中创建maven工程
转载:http://blog.sina.com.cn/s/blog_4f925fc30102epdv.html 先要在MyEclipse中对Maven进行设置: 到此Maven对MyEclip ...
- [Unity菜鸟] 协程Coroutine
1.协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态. unity中StartCoroutine()就是协程,协程实际上是在一个线程中, ...
- Revit 二次开发 沿弧形路径创建拉伸屋顶
沿弧形路径创建拉伸屋顶 Revit的API中只能按照直线创建拉伸屋顶,不能按照曲线创建拉伸屋顶.在Revit的界面当中,可以用 构建->内建模型,进行放样创建屋顶.但是没有办法代码内建模型. 可 ...
- extends:类似于java中的继承特征,extends="struts-default"
extends:类似于java中的继承特征,extends="struts-default"就是继承struts-default.xml,它里面定义了许多跳转类型.拦截器等一些常用 ...
- ShareSDK 实现新浪微博分享(微信,QQ,新浪微博类似)
1 . 分享(前提是集成了sdk,配置好了Key),只要实现点击事件,调用shareSina(); ShareSDK.initSDK(this); private void shareSina() { ...