`
zhujianjia
  • 浏览: 478728 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转:java 注解 实战剖析

阅读更多

为了是大家初步了解什么是注解(Annotation),我们先来看如下代码:
相关代码一:
public class AnnotationTest {
public static void main(String[] args) {
Date nowDate = new Date();
String strDate = nowDate.toLocaleString();
System.out.println(strDate);// 2009-12-27 16:44:09
}
}
上述代码在eclipse编辑器中会出现警告,内容为"The method toLocaleString() from the type Date is deprecated",它的意思是说toLocaleString()方法是个过时的方法;
为了更好的理解它的含义,我们在cmd窗口来编译它,如下


那么我们可以怎么把这个警告给去掉呢,这是就要使用到注解,我们在main方法之前加上这样一句"@SuppressWarnings("deprecation")",也可以用快捷方式加上,那么警告就会消失。
代码就变成了这样:
public class AnnotationTest {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
Date nowDate = new Date();
String strDate = nowDate.toLocaleString();
System.out.println(strDate);// 2009-12-27 16:44:09
}
}

注意:每个注解就是一个类,我们在用注解时,就相当于创建了一个注解类的实例;

2.在写程序中,我们可能不希望某个方法之后不被再次调用,那么我们就可以把这个方法定义为过时的方法,过时的方法在调用时,会在方法名上打上删除线,告诉程序员该方法为过时方法,最后不要再用了。下面我们写一个自定义的过时方法:
相关代码二:
public class AnnotationTest {

@Deprecated
private static void sayHello() {
System.out.println("Hello word !");
}
public static void main(String[] args) {
AnnotationTest.sayHello();
}
}

注意:只需要在方法前加上:@Deprecated,那么该方法就会被eclipse编辑器打上删除线,来表明为过时方法.

3.JDK为我们提供了如下3中基本的注解Annotation:
.Deprecated:用@Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。
.Override:用@Override表示一个方法声明打算重写超类中的另一个方法声明。
.SuppressWarnings:@SuppressWarnings("deprecation")指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。

4.注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,java编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事,标记可以加在包,类,字段,方法,方法的参数以及局部变量上。它位于java.lang.annotation中。

5.通常应用注解有如下三个步骤:
1).定义注解类,格式为:public @interface A{
}
2).应用注解类,如:
@A
class B{
}
3).对应用注解类的类进行反射操作(的类),如:
B.class.isAnnotationPresent(A.class);
A a = B.class.isAnnotationPresent(A.class);

6.下面我们来完成上述三步操作:
1).切换到java透视图上,点击新建一个注解:
代码如:
public @interface MyAnnotation {
}
2).创建一个类应用该注解:
@MyAnnotation
public class AnnotationTest {
public static void main(String[] args) {
}
}
3.对应用注解类的类进行反射操作:
public static void main(String[] args) {
if (AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation myAnnotation = AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(myAnnotation);
}
}
注:这是程序运行没有输出,明明有注解,怎么会没输出呢?这时我们在MyAnnotation注解类前面加上:@Retention(RetentionPolicy.RUNTIME),再次运行时,就会输出"MyAnnotation"

7.下面我们来解释下什么叫Retention,Retention本身也是一个注解,叫元注解,它后面跟一个值,这个值表示该注解保留到代码的那个阶段;
@Retention元注解,有三种取值,即有三种生命周期:
RetentionPolicy.SOURCE:对应java源文件
RetentionPolicy.CLASS:对应class文件
RetentionPolicy.RUNTIME:对应内存中的字节码
默然值就是RetentionPolicy.CLASS,在注解类上加的注解叫“元注解”,class文件本身不是字节码,只有class文件被类加载器被加载到内存中进行校检处理之后,才是二进制的字节码,他们的生命周期不是不同的。
注:如果我们把6中的RetentionPolicy.RUNTIME,改成其他两个中任何一个得话,也是无输出的,因外其他两个的注解生命周期不是运行期,即在内存中无法找到。

8.如果我们在MyAnnotation注解类前面再加上:@Target(ElementType.METHOD),那么AnnotationTest类前面就会有错误提示:"The annotation @MyAnnotation is disallowed for this location",即@MyAnnotation不能放在这个位置,为什么呢?因为刚才我们在MyAnnotation注解类前面再加上:@Target(ElementType.METHOD),它表示该注解只能用在方法上面,如果要想让该注解用的类上面,就可以不刚才那句修改成"@Target({ElementType.METHOD,ElementType.TYPE})",ElementType.TYPE它表示该注解可以应用的类,接口,枚举等类型上。

9.注解的高级应用-为注解增加属性,我们在刚才的MyAnnotation注解类增加一个属性,代码如下:
代码:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
String color();
}
那么此时,我们就会发现,AnnotationTest类的上面有错误提示“The annotation @MyAnnotation must define the attribute color”,即必定义color的属性,我们此时就可以把类上面的注解修改成:@MyAnnotation(color="red"),OK了!说明注解类有属性时,在我们调用时就必须提供属性值,除非注解类中的属性有默认值,
代码:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
String color() default "yellow";
}
调用的时候就可以直接:@MyAnnotation或@MyAnnotation();

再如代码:
public @interface MyAnnotation {
String color() default "yellow";
String style();
}
调用的时候就可以直接: @MyAnnotation(color="red",style="fashion")或@MyAnnotation(style="fashion");有默认值的时候,默认值可以省略。

但是通常我们有如下用法:
@SuppressWarnings("deprecation"),它怎么只提供属性值,而没有属性名呢?这就是value()属性的特殊用法,它可以放回任意类型;

再如代码:
public @interface MyAnnotation {
String color() default "yellow";
String style() default "fashion";
String value();
}
调用的时候就可以直接: @MyAnnotation(color="red",style="fashion",value="hello")
或@MyAnnotation("hello");

10.为注解增加高级属性,如数组,枚举,注解,具体就不再举例了,可以参考java语言规范中的实例。

 

转自:http://hi.baidu.com/suny_duan/blog/item/25a1c8ae3ed763f0faed50ec.html

  • 大小: 4.6 KB
分享到:
评论

相关推荐

    java8源码-dive-in-java8-analyse-action:Java8深入剖析与实战

    Java8深入剖析与实战(圣思园) 关于函数式接口 1、如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口。 2、如果我们在某个接口上声明了FunctionalInterface注解,那么编译器就会按照函数式接口的定义...

    framework-tutorial:Java通用框架实战教程,包含Activiti,Dubbo,Mybatis-Plus,Netty,POI,RabbitMQ,Spring注解驱动开发,SpringBoot源码分析,SpringCloud实战,Spring MVC注解开发,SSM集成,Zookeeper + Dubbo覆盖了系统,持续更新中!

    Java常用框架实战教程 模块 说明 框架教程活动 激战实战 框架教程-easyexcel EasyExcel实战 框架教程弹性工作 弹性工作 框架教程弹性工作春天 弹性工作结合弹簧实战 框架教程可流动 流动的实战 框架教程网 实战 ...

    尚硅谷_宋红康_第10章_枚举类与注解.pdf

    ·自Java语言起源始,循序渐进,知识点剖析细致且每章配备大量随堂练习,让你步步为营,学得透彻、练得明白 ·拒绝晦涩难懂的呆板教学,宋老师语言生动幽默,举例形象生动深入浅出,迅速让你把握问题本质,四两拨千...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    Java常用框架实战教程

    Java常用框架实战教程,包含Activiti,Dubbo,Mybatis—Plus,Netty,POI,RabbitMQ,Spring注解驱动开发,SpringBoot源码分析,SpringCloud实战,SpringMVC注解开发,SSM整合,Zookeeper+Dub….zip

    Spring Data JPA从入门到精通

    'SpringDataJPA从入门到精通'以SpringBoot为技术基础 从入门到精通 ...'SpringDataJPA从入门到精通'适合Java开发初学者、Java开发工程师、Java开发架构师阅读 也适合高等院校和培训学校相关专业的师生教学参考。

    N学Java资深研发工程师1期81G

    03-注解 · 给java带来的优雅之道.mp4 04-语言新特性.mp4 06-面向对象设计.mp4 08-面向对象设计:设计模式(上).mp4 10-企业级基础组件应用与实战:JVM调优(上).mp4 14-企业级基础组件应用与实战:多线程与并发...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 259 10.2.2 解析与填充符号表 / 262 10.2.3 注解处理器 / 264 10.2.4 语义分析与字节码生成 / 264 10.3 Java语法糖的味道 / 268 10.3.1 泛型与类型擦除 / 268 10.3.2 自动装箱、拆箱与遍历循环 / 273 10.3.3...

    Java虚拟机

    这本书的内容是帮你全面了解java虚拟机,本书第1版两年内印刷近10次,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的...

    Struts2实战.pdf

    《Struts 2实战》结合实例介绍了Struts 2框架,主要内容包括Action、Result、Interceptor等框架组件,基于注解的配置选项等新特征,Struts 2插件 FreeMarker,如何从Struts 1和WebWork 2迁移到Struts 2,Ajax标签、...

    road-of-arch:Java技术系统(核心知识点)

    前言 主要包含“技术体系”总导图,detail-xmind详细...分库分表,高并发,高性能,高扩展,稳定性,数据分析等经典方案实战大杂烩。 五MySql原理 在mysql中思考 含MySql原理,索引,调优等。 六缓存中间件 无神的思考

    尚硅谷_宋红康_第10章节练习_枚举类与注解.doc

    ·自Java语言起源始,循序渐进,知识点剖析细致且每章配备大量随堂练习,让你步步为营,学得透彻、练得明白 ·拒绝晦涩难懂的呆板教学,宋老师语言生动幽默,举例形象生动深入浅出,迅速让你把握问题本质,四两拨千...

    Spring Boot实战与原理分析视频课程全2020(7.16G)

    9SpringBoot@Enable*注解的工作原理47:07 10SpringBoot@EnableAutoConfiguration深入分析30:55 11SpringBoot事件监听--四种方式讲解如何配置事件监听27:53 12SpringBoot扩展分析33:54 13SpringBoot补充讲解21:59 14...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    手写Java框架系列教程之二注解

    本课程为完整Java高级架构师课程体系,目的在于培养企业急需的高级开发者,课程内容包括Java热门技术/高并发/高可用/高扩展/性能优化/源码分析/面试解读/项目实战架构实战等知识点。讲师均为行业资深从业者,拥有...

    java8源码-java-tutorial-old:此仓库废弃,最新请查看https://github.com/geekerstar/java

    Java8深入剖析与实战 关于函数式接口 1、如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口。 2、如果我们在某个接口上声明了FunctionalInterface注解,那么编译器就会按照函数式接口的定义要求该接口。 ...

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

Global site tag (gtag.js) - Google Analytics