java中的注解 详解
来源:互联网 发布:beauty cam是什么软件 编辑:程序博客网 时间:2024/05/21 14:44
1、单行(single-line)--短注释://……
单独行注释:在代码中单起一行注释,注释前最好有一行空行,并与其后的代码具有一样的缩进层级。如果单行无法完成,则应采用块注释。
注释格式:
行头注释:在代码行的开头进行注释。主要为了使该行代码失去意义。
注释格式:// 注释内容
行尾注释:尾端(trailing)--极短的注释,在代码行的行尾进行注释。一般与代码行后空8(至少4)个格,所有注释必须对齐。
注释格式:代码 + 8(至少4)个空格 + // 注释内容
2、块(block)--块注释:
注释若干行,通常用于提供文件、方法、数据结构等的意义与用途的说明,或者算法的描述。一般位于一个文件或者一个方法的前面,起到引导的作用,也可以根据需要放在合适的位置。这种域注释不会出现在HTML报告中。注释格式通常写成:
3、文档注释:
注释若干行,并写入javadoc文档。每个文档注释都会被置于注释定界符
之中,注释文档将用来生成HTML格式的代码报告,所以注释文
档必须书写在类、域、构造函数、方法,以及字段(field)定义之前。注释文档由两部分组成——描述、块标记。注释文档的格式如下:
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
前两行为描述,描述完毕后,由@符号起头为块标记注释。更多有关文档注
释和javadoc的详细资料,参见javadoc的主页: http://java.sun.com/javadoc/index.html
4、javadoc注释标签语法
@author
@version
@see
@param
@return
@exception
六、JAVA注释具体实现
1、源文件注释
源文件注释采用,在每个源文件的头部要有必要的注释信息,包括:文件名;文件编号;版本号;作者;创建时间;文件描述包括本文件历史修改记录等。中文注释模版:
2、类(模块)注释:
类(模块)注释采用,在每个类(模块)的头部要有必要的注释信息,包括:工程名;类(模块)编号;命名空间;类可以运行的JDK版本;版本号;作者;创建时间;类(模块)功能描述(如功能、主要算法、内部各部分之间的关系、该类与其类的关系等,必要时还要有一些如特别的软硬件要求等说明);主要函数或过程清单及本类(模块)历史修改记录等。
英文注释模版:
如果模块只进行部分少量代码的修改时,则每次修改须添加以下注释:
//Rewriter
//Rewrite Date:<修改日期:格式YYYY-MM-DD> Start1:
//End1:
将原代码内容注释掉,然后添加新代码使用以下注释:
//Added by
//Add date:<添加日期,格式:YYYY-MM-DD> Start2:
//End2:
如果模块输入输出参数或功能结构有较大修改,则每次修改必须添加以下
注释:
//Log ID:<Log编号,从1开始一次增加>
//Depiction:<对此修改的描述>
//Writer:修改者中文名
//Rewrite Date:<模块修改日期,格式:YYYY-MM-DD>
2、接口注释:
接口注释采用,在满足类注释的基础之上,接口注释应该包含描述接口的目的、它应如何被使用以及如何不被使用,块标记部分必须注明作者和版本。在接口注释清楚的前提下对应的实现类可以不加注释。
3、构造函数注释:
构造函数注释采用 ,描述部分注明构造函数的作用,不一定有块标记部分。
注释模版一:
注释模版二:
4、函数注释:
函数注释采用,在每个函数或者过程的前面要有必要的注释信息,包括:函数或过程名称;功能描述;输入、输出及返回值说明;调用关系及被调用关系说明等。函数注释里面可以不出现版本号(@version)。
注释模版一:
注释模版二:
5、方法注释:
方法注释采用 ,对于设置 (Set 方法 ) 与获取 (Get 方法 ) 成员的方法,在成员变量已有说明的情况下,可以不加注释;普通成员方法要求说明完成什么功能,参数含义是什么且返回值什么;另外方法的创建时间必须注释清楚,为将来的维护和阅读提供宝贵线索。
6、方法内部注释:
控制结构,代码做了些什么以及为什么这样做,处理顺序等,特别是复杂的逻辑处理部分,要尽可能的给出详细的注释。
7、 全局变量注释:
要有较详细的注释,包括对其功能、取值范围、哪些函数或者过程存取以及存取时注意事项等的说明。
8、局部(中间)变量注释:
主要变量必须有注释,无特别意义的情况下可以不加注释。
9、实参/参数注释:
参数含义、及其它任何约束或前提条件。
10、字段/属性注释: 字段描述,属性说明。
11、常量:常量通常具有一定的实际意义,要定义相应说明。
一、什么是注释
二、J2SE5.0中预定义的注释
Override
class ParentClass1
...{
public void myMethod1() ...{...}}class Class1 extends ParentClass1
...{
public void myMethod2() ...{...}}
建立Class1的实例,并且调用myMethod1方法
ParentClass1 c1 = new Class1();
c1.myMethod1();
以上的代码可以正常编译通过和运行。但是在写Class1的代码时,误将myMethod1写成了myMethod2,然而在调用时,myMethod1并未被覆盖。因此,c1.myMethod1()调用的还是ParentClass1的myMethod1方法。更不幸的是,程序员并未意识到这一点。因此,这可能会产生bug。
class Class1 extends ParentClass1
...{
@Override // 编译器产生一个错误 public void myMethod2()
...{...}}
以上代码编译不能通过,被Override注释的方法必须在父类中存在同样的方法程序才能编译通过。也就是说只有下面的代码才能正确编译。
class Class1 extends ParentClass1
...{
@Override
public void myMethod1() ...{...}}
Deprecated
图1 加上@Deprecated后的类成员在eclipse中的变化
class Class1
...{
@Deprecated
public void myMethod()...{}}class Class2 extends Class1
...{
public void myMethod()...{}}
1
1
运行javac test.java 出现如下警告:
public void myMethod()
...{
List wordList = new ArrayList();
wordList.add("foo");
}
这是一个类中的方法。编译它,将会得到如下的警告。
1
public void myMethod()
{
List<String> wordList = new ArrayList<String>();
wordList.add("foo");
}
另外一种方法就是使用@SuppressWarnings。
@SuppressWarnings (value={"unchecked"})
public void myMethod()
{
List wordList = new ArrayList();
wordList.add("foo");
}
要注意的是SuppressWarnings和前两个注释不一样。这个注释有一个属性。当然,还可以抑制其它警告,如:
@SuppressWarnings (value={"unchecked", "fallthrough"})
三、如何自定义注释
public @interface MyAnnotation
...{
}
上面的代码是一个最简单的注释。这个注释没有属性。也可以理解为是一个标记注释。就象Serializable接口一样是一个标记接口,里面未定义任何方法。
public @interface MyAnnotation
...{
String value();
}
可以按如下格式使用MyAnnotation
@MyAnnotation("abc")
public void myMethod()
...{
}
看了上面的代码,大家可能有一个疑问。怎么没有使用value,而直接就写”abc”了。那么”abc”到底传给谁了。其实这里有一个约定。如果没有写属性名的值,而这个注释又有value属性,就将这个值赋给value属性,如果没有,就出现编译错误。
public @interface MyAnnotation
...{
public String myMethod()...{} default “xyz”;
}
可以直接使用MyAnnotation
@MyAnnotation // 使用默认值xyz public void myMethod()
...{
}
也可以这样使用
@MyAnnotation(myMethod=”abc”)
public void myMethod()
...{
}
public @interface MyAnnotation
...{
public enum MyEnum...{A, B, C}public MyEnum.value1() ...{}public String value2() ...{}}@MyAnnotation(value1=MyAnnotation.MyEnum.A, value2 = “xyz”)
public void myMethod()
...{
}
这一节讨论了如何自定义注释。那么定义注释有什么用呢?有什么方法对注释进行限制呢?我们能从程序中得到注释吗?这些疑问都可以从下面的内容找到答案。
1
四、如何对注释进行注释
在上一节讨论了自定义注释,由此我们可知注释在J2SE5.0中也和类、接口一样。是程序中的一个基本的组成部分。既然可以对类、接口进行注释,那么当然也可以对注释进行注释。
@Target(...ElementType.METHOD)
@interface MyAnnotation ...{}@MyAnnotation // 错误的使用 public class Class1
...{
@MyAnnotation // 正确的使用 public void myMethod1() ...{}}
说到这,大家可能已经基本明白了。原来target所指的目标就是java的语言元素。如类、接口、方法等。当然,Target还可以对其它的语言元素进行限制,如构造函数、字段、参数等。如只允许对方法和构造函数进行注释可以写成:
@Target(...{ElementType.METHOD, ElementType.CONSTRUCTOR})
@interface MyAnnotation ...{}
Retention
@Retention(RetentionPolicy.SOURCE)
@interface MyAnnotation1 ...{ }@Retention(RetentionPolicy.CLASS)
@interface MyAnnotation2 ...{}@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3 ...{}
Documented
@interface MyAnnotation...{ }@MyAnnotation
class Class1
...{
public void myMethod() ...{ }}
使用javadoc为这段代码生成文档时并不将@MyAnnotation包含进去。生成的文档对Class1的描述如下:
class Class1extends java.lang.Object
而如果这样定义MyAnnotation将会出现另一个结果。
@Documented
@interface MyAnnotation ...{}生成的文档:
@MyAnnotation // 这行是在加上@Documented后被加上的 class Class1extends java.lang.Object
Inherited
@Inherited
@interface MyAnnotation ...{ }@MyAnnotation
public class ParentClass ...{}public class ChildClass extends ParentClass ...{ }在以上代码中ChildClass和ParentClass一样都已被MyAnnotation注释了。
五、如何使用反射读取注释
在以前的JDK版本中,我们可以使用反射得到类的方法、方法的参数以及其它的类成员等信息。那么在J2SE5.0中同样也可以象方法一样得到注释的各种信息。
Annotation annotation = TestAnnotation.class.getAnnotation(MyAnnotation.class);
如果要得到全部的注释信息可使用如下语句:
Annotation[] annotations = TestAnnotation.class.getAnnotations();
或
Annotation[] annotations = TestAnnotation.class.getDeclaredAnnotations();
getDeclaredAnnotations与getAnnotations类似,但它们不同的是getDeclaredAnnotations得到的是当前成员所有的注释,不包括继承的。而getAnnotations得到的是包括继承的所有注释。
Method method = TestAnnotation.class.getMethod("myMethod", null);
Annotation annotation = method.getAnnotation(MyAnnotation.class);
注:要想使用反射得到注释信息,这个注释必须使用
@Retention(RetentionPolicy.RUNTIME)进行注释。
总结
文章地址
- java中的注解 详解
- 详解Java中的注解
- 详解Java中的注解
- 详解Java中的注解
- 详解Java中的注解
- Java中的注解详解
- Java编程之反射中的注解详解
- Java编程之反射中的注解详解
- java 注解详解,自定义注解
- Java中的Annotation详解和使用 自定义注解
- 详解Java的Spring框架中的注解的用法
- Java中的注解/注释详解(Override/Deprecated/SuppressWarning)
- 详解Java的Spring框架中的注解的用法
- Spring 详解Java的Spring框架中的注解的用法
- JAVA 注解示例 详解
- JAVA 注解示例 详解
- JAVA 注解示例 详解
- JAVA 注解示例 详解
- ImageView的android:maxHeight,android:minHeight的正确设置
- 技术大牛是如何拿到国内IT巨头offer的?
- Walking on a Grid - UVa 10913 dp
- HDU-2377 Bus Pass
- 禁止网页刷新JS
- java中的注解 详解
- (c语法百题2)加法
- 黑马程序员_Java高新技术:反射
- tomcat注册成windows服务 (截图说明一目了然)
- 移动平台WEB前端开发技巧汇总
- ADO.NET之5-使用Command对象删除记录---ShinePans
- 数码管 C语言 共阴共阳编码表
- 云平台之多租户
- LVM2 Logical Volume Manager 详解(七)--LVM卷组Volume Group命令实战