- 浏览: 285669 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jim8757:
能提供下完整的代码吗?
实例解析java + jQuery + json工作过程(登录) -
befairy:
收藏,谢谢LZ
基于Java、jQuery应用的账务管理系统开源了(09.3.19更新) -
Gilbert_Sam:
我看过这本书,很好,看到二十几章的地方,结果网站就登陆不上,写 ...
Linux C编程一站式学习 http://learn.akae.cn/ -
ljy520zhiyong:
这个网址进入不了呀
Linux C编程一站式学习 http://learn.akae.cn/ -
蜀山红日:
如果后台要向前台返回复杂数据该怎么办呢
实例解析java + jQuery + json工作过程(登录)
背景知识:
从JDK5开始提供名为Annotation(注释)的功能,它被定义为JSR-175规范。注释是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked")。注释可以附加在package, class, method, field等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。如果没有外部解析工具等对其加以解析和处理的情况,本身不会对Java的源代码或class文件等产生任何影响,也不会对它们的执行产生任何影响。
元数据的作用,大致可分为三种:编写文档,通过代码里标识的元数据生成文档;代码分析,通过代码里标识的元数据对代码进行分析;编译检查,通过代码里标识的元数据让编译器能实现基本的编译检查。
JDK5内置的基本注释
JDK5内置了一些常用的注释,可以在编译时帮我们捕获部分编译错误,及提示信息,下面介绍下这些注释的用法:
1、@Override定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。例如我们为某类重写toString()方法却写成了tostring(),并且我们为该方法添加了@Override注释;代码如下:
- public class OverrideDemo {
- @Override
- public String tostring() {
- return super.toString();
- }
- }
public class OverrideDemo { @Override public String tostring() { return super.toString(); } }
在编译时,会提示以下错误信息:
@Override
^1 错误
2、@Deprecated定义在java.lang.Deprecated中,此注释可用于修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。使用@Deprecated的示例代码如下:
- public class DeprecatedDemo {
- public static void main(String[] args) {
- DeprecatedClass.DeprecatedMethod();
- }
- }
- class DeprecatedClass {
- @Deprecated
- public static void DeprecatedMethod() {
- // TODO
- }
- }
public class DeprecatedDemo { public static void main(String[] args) { DeprecatedClass.DeprecatedMethod(); } } class DeprecatedClass { @Deprecated public static void DeprecatedMethod() { // TODO } }
在编译时,会得到以下提示信息:
注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。
如果在编译时添加-Xlint:deprecation参数,我们能更清楚的看到该警告的详细信息,如下:
SomeClass.DeprecatedMethod();
^1 警告
要注意@Deprecated与@deprecated的区别,@deprecated是为了生成文档的需要,例如:
- class DeprecatedClass {
- /**
- * @deprecated 此方法已过时,不建议使用
- */
- @Deprecated
- public static void DeprecatedMethod() {
- // TODO
- }
- }
class DeprecatedClass { /** * @deprecated 此方法已过时,不建议使用 */ @Deprecated public static void DeprecatedMethod() { // TODO } }
3、@SuppressWarnings定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息。与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数值都是已经定义好了的,我们选择性的使用就好了,参数如下:
通过上面的表格,你应该了解到每个参数的用意了,下面我就以一个常用的参数unchecked为例,为你展示如何使用@SuppressWarnings注释,示例代码如下:
- import java.util.List;
- import java.util.ArrayList;
- public class SuppressWarningsDemo {
- public static List cache = new ArrayList();
- //@SuppressWarnings(value = "unchecked")
- public void add(String data) {
- cache.add(data);
- }
- }
import java.util.List; import java.util.ArrayList; public class SuppressWarningsDemo { public static List cache = new ArrayList(); //@SuppressWarnings(value = "unchecked") public void add(String data) { cache.add(data); } }
当我们不使用@SuppressWarnings注释时,编译器就会有如下提示:
注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。
下面我们去掉@SuppressWarnings(value="unchecked")这一行的注释符“//”,它会屏蔽编译时的警告信息,这也就是它所要达到的目的。
另外,由于@SuppressWarnings注释只有一个参数,并且参数名为value,所以我们可以将上面一句注释简写为
@SuppressWarnings("unchecked");
同时参数value可以取多个值如:
@SuppressWarnings(value={"unchecked", "deprecation"})
或@SuppressWarnings({"unchecked", "deprecation"})。
自定义Annotation注释
1、注释annotation与接口的异同:
因为annotation类型是一个非凡的接口,所以它与接口之间存在着某些差异:
A. Annotation类型使用关键字@interface而不是interface,这个关键字声明隐含了一个信息,它是继承了java.lang.annotation.Annotation接口,并非声明了一个interface。
B. Annotation类型的方法定义是独特的、受限制的,方法必须声明为无参数、无异常抛出的。这些方法定义了annotation的成员:方法名成为了成员名,而方法返回值成为了成员的类型。而方法返回值类型必须为primitive类型、Class类型、枚举类型、annotation类型或者由前面类型之一作为元素的一维数组。方法的后面可以使用default和一个默认数值来声明成员的默认值,null不能作为成员默认值,这与我们在非annotation类型中定义方法有很大不同。
C. Annotation类型又与接口有着近似之处,它们可以定义常量、静态成员类型(比如枚举类型定义)。Annotation类型也可以如接口一般被实现或者继承。
2、自定义注释的实例:
下面,我们将看到如何定义annotation类型的例子。它展示了annotation类型声明以及
- @interface与interface之间的不同:
- import java.lang.annotation.*;
- /**
- * 使用annotation来描述那些被标注的成员是不稳定的,需要更改
- */
- public @interface Unstable {
- }
@interface与interface之间的不同: import java.lang.annotation.*; /** * 使用annotation来描述那些被标注的成员是不稳定的,需要更改 */ public @interface Unstable { }
下面的另一个例子只定义了一个成员。并通过将这个成员命名为value,使我们可以方便的使用这种annotation的快捷声明方式:
- /**
- * 使用Author这个annotation定义在程序中指出代码的作者
- */
- public @interface Author {
- /** 返回作者名 */
- String value();
- }
/** * 使用Author这个annotation定义在程序中指出代码的作者 */ public @interface Author { /** 返回作者名 */ String value(); }
以下的例子更加复杂。Reviews annotation类型只有一个成员,但是这个成员的类型是复杂的:由Review annotation组成的数组。Review annotation类型有3个成员:枚举类型成员grade、表示Review名称的字符串类型成员Reviewer、具有默认值的字符串类型成员 Comment。
- /**
- * Reviews annotation类型只有一个成员,
- * 但是这个成员的类型是复杂的:由Review annotation组成的数组
- */
- @Retention(RetentionPolicy.RUNTIME)
- public @interface Reviews {
- Review[] value();
- }
- /**
- * Review annotation类型有3个成员:
- * 枚举类型成员grade、
- * 表示Review名称的字符串类型成员Reviewer、
- * 具有默认值的字符串类型成员Comment。
- */
- public @interface Review {
- // 内嵌的枚举类型
- public static enum Grade { EXCELLENT, SATISFACTORY, UNSATISFACTORY };
- // 下面的方法定义了annotation的成员
- Grade grade();
- String reviewer();
- String comment() default "";
- }
/** * Reviews annotation类型只有一个成员, * 但是这个成员的类型是复杂的:由Review annotation组成的数组 */ @Retention(RetentionPolicy.RUNTIME) public @interface Reviews { Review[] value(); } /** * Review annotation类型有3个成员: * 枚举类型成员grade、 * 表示Review名称的字符串类型成员Reviewer、 * 具有默认值的字符串类型成员Comment。 */ public @interface Review { // 内嵌的枚举类型 public static enum Grade { EXCELLENT, SATISFACTORY, UNSATISFACTORY }; // 下面的方法定义了annotation的成员 Grade grade(); String reviewer(); String comment() default ""; }
最后,我们来定义一个annotation方法用于罗列出类运行中所有的unchecked异常。这个 annotation类型将一个数组作为了唯一的成员。数组中的每个元素都是异常类。为了加强对未检查的异常(此类异常都是在运行时抛出)进行报告,我们可以在代码中对异常的类型进行限制:
public @interface UncheckedExceptions { Class[] value(); }
Meta-Annotation类型:
Annotation 类型可以被它们自己所标注。Java5.0定义了4个标准的meta-annotation类型,分别是:Target、Retention、Documented、Inherited,它们被用来提供对其它annotation类型作说明。 这些类型和它们所支持的类在java.lang.annotation包中可以找到。
@Target的用法:指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。 例如,以下这个注释只能用来声明方法:
@Target(ElementType.METHOD) public @interface MyAnnotation { ... }
java.lang.annotation.ElementType是一个枚举类型,它具有以下定义:
@Retention的用法:指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS,例如:
@ Retention(RetentionPolicy.CLASS) public @interface MyAnnotation { ... }
java.lang.annotation.RetentionPolicy是一个枚举类型,它具有以下定义:
@Documented的用法:指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分。Documented是一个没有成员的注释。
@Inherited的用法:指示注释类型自动被子类继承。 Inherited也是一个没有成员的注释。
注意,如果使用@Inherited注释类以外的任何事物都是无效的。还要注意,此元注释仅对从超类继承注释有效;对已实现接口的注释无效。
源自:http://linliangyi2007.iteye.com/blog/165316
发表评论
-
自定义js延时函数
2010-03-26 11:38 4547setTimeout不是真正意义上的延时函数,而且在表单提交后 ... -
ssh jar包配置
2009-11-27 11:31 2314本文中ssh指:struts2,srping2.5,hib ... -
每个项目中,你不得不知的11个Java第三方类库
2009-11-02 09:06 1119Java第三方library ecosystem是一个很广阔的 ... -
J2EE学习中一些值得研究的开源项目
2009-08-10 10:07 1175这篇文章写在我研究J2SE、J2EE近三年后。前3年 ... -
对JXL包的研究(java操作excel)
2009-06-25 07:44 1544对JXL包的研究(java操作excel) 在开源世界中,有两 ... -
java类中成员的装载顺序你知道吗
2009-04-03 08:18 1006最近去参加了SCJP培训,相信对于绝大多数的JAVA工作者来说 ... -
java操作word文件
2009-03-31 15:41 1731一个jacob操作Word的例子 import java. ... -
Java操作PDF文件(iText)
2009-03-31 15:32 5902然jacob中也有关于PDF的方法,但是过于复杂。iText是 ... -
java对excel操作
2009-03-31 15:11 1475从Excel文件读取数据表 Java Excel API既可 ... -
JAVA解析XML的四种方法
2009-03-31 08:49 1417XML现在已经成为一种通 ... -
Java:集合类性能分析
2009-03-20 20:41 19651.Java 集合框架图 -集合接口:6个接口(短虚 ... -
在看commons-lang.jar包源码时候的一些发现及实践
2009-03-11 10:55 3631通常,我们在完成一个标准的JavaBean的时候,都需要同时完 ... -
解决大批量数据导出Excel产生内存溢出的方案(二)
2009-03-11 10:42 6333客户要求一次导出20w行数据,这就要求导出的文件必须带shee ... -
解决大批量数据导出Excel产生内存溢出的方案
2009-03-11 10:41 5420POI或者JXL在导出大量数据的时候,由于它们将每一个单元格生 ... -
java语言的反射机制1
2009-03-11 10:23 1128java语言的反射机制为是java语言所提供的一项特别吸引人的 ... -
Java获取各种常用时间方法(二)
2009-03-11 09:43 1070//获得本年最后一天的日期 * ... -
Java获取各种常用时间方法
2009-03-11 09:40 1218本人之前做的项目中积累常用的时间方法,贴出来与大家共享,如果哪 ... -
JavaSE6.0 Web Service学习笔记(二)
2009-03-11 09:30 7410JavaSE6.0下的Web Service 从JavaSE6 ... -
JavaSE6.0 Web Service学习笔记(一)
2009-03-11 09:24 1441Web Service概述 Web Service ... -
JasperReport报表设计总结(三)(已完毕)
2009-03-11 09:20 1400由于在一个里面不能贴太多的代码,故放置代码在此处。上接:htt ...
相关推荐
本学习笔记将深入探讨JDK 5.0的关键知识点,帮助开发者理解和掌握这个版本的重要更新。 一、泛型(Generics) 泛型是JDK 5.0引入的一项重要特性,它允许在定义类、接口和方法时指定类型参数,增强了类型安全性和...
以下是对Java JDK 5.0学习笔记的一些关键知识点的详细解析: 1. **自动类型转换与装箱拆箱**: - Java 5.0引入了自动装箱和拆箱机制,使得基本数据类型和其对应的包装类之间可以无缝转换。例如,`Integer i = 10;`...
良葛格的《Java JDK5.0学习笔记》是一本面向初学者的教程,旨在帮助读者掌握这个版本的核心概念和技术。以下是基于该书部分内容的知识点详解: 1. **泛型**:JDK 5.0引入了泛型,这是一种强大的类型系统增强,允许...
"SCJP考试模拟机——基于jdk5.0"是一款专门为准备SCJP考试的学员设计的模拟测试工具,它按照实际考试的标准和格式,帮助考生在家中或任何地方模拟真实的考试环境,提升备考效果。 这款模拟机的核心功能可能包括以下...
《Hibernate Annotation 学习笔记》 在Java的持久化框架中,Hibernate以其强大的功能和易用性成为开发者首选之一。而Hibernate Annotation则是Hibernate提供的一种基于注解的实体映射方式,它极大地简化了传统XML...
通过阅读这份"java jdk 5.0学习笔记",初学者将能够逐步掌握Java编程的基本语法、面向对象编程概念、异常处理、I/O流、多线程、网络编程以及集合框架等内容。同时,了解并实践Java 5的新特性,能够帮助开发者编写出...
"良葛格java.jdk5.0学习笔记"中可能涵盖了这些内容,例如: 1. **类与对象**:Java中的万物皆为对象,类是创建对象的蓝图。笔记会详细介绍如何定义类,声明成员变量和方法,以及如何通过构造器初始化对象。 2. **...
Tiger是指Java 5.0版本(也称为JDK 1.5),这一版引入了许多新特性,例如泛型、注解(Annotation)、自动装箱等。这些新特性极大地提高了Java语言的表达能力和开发效率,是学习Java EE必须掌握的知识点。 XML学习...