`
zhujianjia
  • 浏览: 484137 次
  • 性别: 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
分享到:
评论

相关推荐

    精通Hibernate:Java对象持久化技术详解.pdf

    《精通Hibernate:Java对象持久化技术详解》这本书深入剖析了Hibernate这一流行的Java对象关系映射(ORM)框架,旨在帮助开发者全面理解并熟练掌握Hibernate的使用。Hibernate是Java开发中的重要工具,它简化了...

    java开发实战经典源代码

    源码文件列表中的"Java开发实战经典-源码"包含了书中所有章节的实例代码,这些代码涵盖了Java的基础语法、面向对象编程、异常处理、集合框架、多线程、网络编程、I/O流、数据库操作、JDBC、Swing图形界面设计、反射...

    java/ssh注解

    本文将深入探讨这两个领域的注解,包括它们的使用方式、原理,以及如何自定义Java注解。 一、Java注解 1. **注解的基本概念**:Java注解是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不会影响其...

    Java开发实战经典源码

    "Java开发实战经典源码"可能是一份包含多个项目或示例代码的集合,这些代码旨在帮助开发者深入理解Java编程语言的核心概念、设计模式以及最佳实践。在这个压缩包中,"第八章"可能代表一个章节的源码,通常对应于某个...

    疯狂java讲义源码和疯狂Java实战源码

    10. **注解(Annotation)**:Java注解是元数据的一种形式,源码中会包含使用注解进行编译时或运行时处理的实例。 11. **JDBC数据库编程**:源码将展示如何连接数据库、执行SQL语句、处理结果集等,帮助理解数据库...

    Java EE 实战教程

    ### Java EE 实战教程知识点概览 #### 一、Java EE 技术栈与应用场景 - **Java EE**(Java Platform, Enterprise Edition)是用于构建可伸缩且健壮的企业级应用程序的标准平台。它提供了丰富的API和服务,如**JSF*...

    java8源码-Java8InAction:Java8实战学习笔记以及

    10. **Type Annotations**:Java 8增加了类型注解,允许在类型层次上添加元数据,增强了类型系统,有助于代码的验证和编译时检查。 以上是《Java 8 In Action》一书中的主要知识点,通过学习和实践这些内容,开发者...

    java基础知识注解讲解和练习

    Java注解是Java编程语言中的一个重要特性,它允许程序员向代码中添加元数据,这些元数据可以被编译器或运行时环境用于多种目的。注解不会直接影响代码的行为,但可以提供工具、库和JVM(Java虚拟机)用于代码分析、...

    疯狂java实战演义

    《疯狂Java实战演义》是一本深度探讨Java编程技术的实战型书籍,旨在通过一系列精心设计的小程序实例,激发读者的学习热情,提升编程技能。书中的每个实例都是作者精心挑选和编写的,覆盖了Java语言的核心特性以及...

    Java 8 实战教程整理

    8. 类型注解:Java 8增强了类型注解的使用范围,可以在更多的地方使用注解,如类型参数、返回类型、数组元素类型等,增强了静态代码分析和工具的支持。 9. 集合工厂方法:集合接口如List, Set和Map增加了新的工厂...

    Java开发实战1200例(第1卷)

    《Java开发实战1200例(第1卷)》是一部深入浅出的Java编程实践教程,涵盖了广泛的Java开发技术,旨在帮助读者从基础到高级,全面提升编程技能。本卷内容主要关注基础知识与核心概念,为后续实战篇打下坚实的基础。...

    疯狂java实战讲义源码

    《疯狂Java实战讲义源码》是一份宝贵的编程学习资源,它包含了《疯狂java讲义》一书中的课后练习题的参考解答。这个压缩包文件的核心内容是关于Java编程语言的实际应用和深入理解,旨在帮助读者巩固理论知识,提升...

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

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

    李兴华老师的java开发实战经典全套笔记.7z

    Java开发实战经典全套笔记是李兴华老师针对Java初学者及进阶者精心编写的教程集合,涵盖了Java语言的核心概念、重要特性和实际应用。这些笔记以PDF格式提供,易于阅读,同时也支持打印,便于离线学习和长期保存。...

    JavaEE颠覆者spring-boot实战源码.zip

    7. **实战源码分析**: 压缩包中的"SourceCode"可能包含了各种示例应用,如RESTful API服务、数据访问、安全控制、邮件发送等。通过这些源码,你可以学习如何在实际项目中应用Spring Boot的各种特性。 8. **JavaEE...

    [JAVA开发实战经典(名师讲坛)].李兴华.扫描版+目录

    根据提供的文件信息,我们可以推断出这是一本关于Java开发实战的经典教程书籍,作者为李兴华。尽管具体内容部分仅提供了“Test System.out.println();”这样的示例代码,但结合标题和描述,我们可以围绕该书可能涵盖...

    Java软件开发实战 Java基础与案例开发详解 16-6 练习题 共4页.pdf

    - **Java注解**(16-1至16-6):学习注解的基本概念、内置注解类型、自定义注解以及如何通过反射获取注解信息。 - **项目实战**(17-1至17-6):以单机版五子棋游戏为例,进行项目的总体设计、代码实现、运行与发布...

    Java开发技术大全 Java开发实战经典下载地址

    ### Java开发技术大全:Java开发实战经典 #### 一、Java基础篇 1. **基本语法**: - 数据类型:Java中有八种基本数据类型,包括四种整型(byte、short、int 和 long)、两种浮点型(float 和 double)、一种字符...

    Java软件开发实战 Java基础与案例开发详解 20-4 练习题 共4页.pdf

    - **内置注解类型**:Java 提供了一些内置注解,如 @Override、@Deprecated 等。 - **自定义注解**:可以自定义注解类型,并使用它们来标记类、方法等。 ### 17. 实战项目 - **单机版五子棋游戏**:包括总体设计、...

    Java Web项目整合开发源码

    2. MyBatis:MyBatis是一个持久层框架,它简化了SQL操作,通过XML或注解的方式将SQL与Java代码绑定,实现了DAO层的便捷开发。 3. Struts2:Struts2是一个基于MVC设计模式的Java Web框架,提供了动作(Action)和结果...

Global site tag (gtag.js) - Google Analytics