You are on page 1of 72

↘┚

[Java 2 Coding ]

JAVA编码标准及规范手册
et
A Standard & Style of Java Code
This handbook shows how to coding the java programe with standard and good style

● 作者: 周甫

邮件: zoof@263.net
版本: 1.0.04-09-2002
最后修改: Sep 04,2002

----------------------------------------- Copyleft ( 2002 ) with GNU Free Documentation License. -----------------------------------


Java 编码标准及规范手册 2

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 3

目 录

Chapter 1 原则
1.1 包的命名原则………………………………………………………………………………. 5

1.2 类命名……………………………………………………………………………………… 5

1.3 Tab 与 Space………………………………………………………………………………. 5

1.4 大括号{}规则………………………………………………………………………………. 5

1.5 小括号()及逗号,规则……………………………………………………………………… 5

1.6 类文件大小………………………………………………………………………………… 6

1.7 main()方法…………………………………………………………………………………. 6

Chapter 2 代码书写规范
2.1 注释书写规范………………………………………………………………………………7

2.2 类结构书写规范…………………………………………………………………………… 8

2.3 方法结构书写规范…………………………………………………………………………11

2.4 语句行书写规范…………………………………………………………………………… 12

2.5 SQL 语句书写规范………………………………………………………………………… 12

Chapter 3 常用方法命名标准………………………………………………………… 14

Chapter 4 类、方法、变量命名缩写规范………………………………………. 17

Chapter 5 常用 AWT/SWING 类命名缩写规范……………………………… 21

Appendix A JDK 开发工具包使用说明


rmic……………………………………………………………………………………………… 22

rmid……………………………………………………………………………………………… 23

rmiregistry………………………………………………………………………………………. 24

serialver………………………………………………………………………………………… 24

jarsigner………………………………………………………………………………………… 25

keytool………………………………………………………………………………………….. 27

native2ascii…………………………………………………………………………………….. 27

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 4

appletviewer……………………………………………………………………………………. 27

extcheck………………………………………………………………………………………… 28

jar……………………………………………………………………………………………….. 29

javac…………………………………………………………………………………………….. 30

javadoc…………………………………………………………………………………………. 31

javah……………………………………………………………………………………………. 37

javap…………………………………………………………………………………………….. 38

Appendix B JAR Archive 进阶……………………………………………………. 40

Appendix C J2ME 工具介绍


C.1 J2ME_CLDC/KVS 安装………………………………………………………………….. 48

C.2 安装 KAWT……………………………………………………………………………….. 48

C.3 如何编译………………………………………………………………………………….. 49

C.4 工具参数使用说明……………………………………………………………………….. 49

C.5 中文问题………………………………………………………………………………….. 52

Appendix D 写 bean 类的准则


D.1 一般要求………………………………………………………………………………….. 53

D.2 特性……………………………………………………………………………………….. 53

D.3 操作……………………………………………………………………………………….. 54

D.4 事件……………………………………………………………………………………….. 55

D.5 提示和窍门……………………………………………………………………………….. 56

Appendix E Javadoc 使用介绍


E.1 前言………………………………………………………………………………………... 59

E.2 Java 文档和 javadoc……………………………………………………………………… 59

E.3 文档注释的格式…………………………………………………………………………... 60

E.4 使用 javadoc 标记………………………………………………………………………… 64

E.5 javadoc 命令………………………………………………………………………………. 69

Appendix F Change Logs and Todo List……………………………………. 70

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 5

Chapter 1 : 原则
1.1 包的命名原则:

规则一:<com>+<组织名称>+<功能>+<具体功能说明>

规则二:扩展包在“组织名称”后加”x”

Example:

数据库工具包: com.zoof.db

常用工具包: com.zoof.util

日期工具包: com.zoof.util.date

扩展的工具包: com.zoofx.util

1.2 类命名:

规则一:<名称>+<功能(类别)>

规则二:前缀单词首字母大写,前缀略写规则见后

规则三:多个单词紧凑连接,且每个单词首字母大写

Example:

数据库连接: DbConn.java

配置文件读取: ConfRead.java

1.3 Tab 与 Space、Blank Space

规则一:1 Tab = 4 Spaces

规则二:方法与方法间留空行(Blank Space)

规则三:操作符号(=、+、|| 等)两边留一个空格

1.4 大括号{}规则

规则一:大括号置于关键字或方法、类名下方同列处.

Example:
public void doit() if(……)
{ {
….. ……
} }
规则二:空方法体,大括号与方法名同行并列
Example:
public void doit() {}
1.5 小括号()及逗号,规则

规则一:<关键字或标识符>+<(左括号>+<参数>+<空格>+<)右括号>
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 6

规则二:<标识符 1>+<,逗号>+<空格>+<标识符 2>+…

1.6 类文件大小:

规则一:每个类文件不应大于 150 行(不包括注释)

1.7 main()方法:

规则一:公共类(public)必须有 main()方法置于类文件底部,并有测试的简单代码

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 7

Chapter 2 : 代码书写规范
2.1 注释书写规范

2.1.1 Javadoc Tools 注释

Javadoc 注释规范主要为类、接口、方法、成员变量生成描述文档的工具,具体的规定请看

(Appendix D),这里仅举一例:
/**
*本程序用于”Fizzbuzz”游戏。 Å 第一段:本类的用途的简要说明
*<p>
*从 1 到 100,如果这个数字是 5 的倍数, Å 第二段:概要说明
*就应该说“fizz”,如果是 7 的倍数,则
*说“buzz”,如果既是 5 的也是 7 的倍数
*就要说“fizzbuzz”。
*<p>
*使用求模操作符来确定数是否能被另一个整除 Å 第三段:算法的概要说明
*<p>
*@author Zoof Chow Å 第四段:作者,按年代顺序排列
*@author ……
*@version %I%,%G% Å 第五段:版本号,这里用 cvs 控制
*@since JDK1.3 Å 第六段:开发时使用的 JDK 版本
*/
2.1.2 段落块(Blocks)与语句(Statements)注释:

对段落(Blocks)与语句的注释,尽量不使用/*…*/而使用//注释,并且注释要精简,一般在语

句转折、算法提示、重要成员变量处注释。下面是不好的与比较好的注释规范的对照:

Example:不好的注释规范:
// applyRotAscii() -- Apply ASCII ROT
private void applyRotAscii(){
try{
int rotLength = Integer.parseInt(rotationLengthField); // get rot len
RotAscii cipher = new RotAscii(rotLength); // new cipher
textArea.setText(cipher.transform(textArea.getText())); // transform
}catch(Exception ex){
/* Show exception */
ExceptionDialog.show(this, "Invalid rotation length: ", ex);
}
}
Example:好的注释书写规范:
/**
* Apply the ASCII rotation cipher to the user's text. The length is retrieved
* from the rotation length field, and the user's text is retrieved from the
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 8

* text area.
*
* @author Thornton Rose
*/
private void applyRotAscii()
{
int rotLength = 0; // rotation length
RotAscii cipher = null; // ASCII rotation cipher

try
{
// Get rotation length field and convert to integer.
rotLength = Integer.parseInt(rotationLengthField.getText().trim());
// Create ASCII rotation cipher and transform the user's text with it.
cipher = new RotAscii(rotLength);
textArea.setText(cipher.transform(textArea.getText()));
}
catch(Exception ex)
{
// Report the exception to the user.
ExceptionDialog.show(this, "Invalid rotation length: ", ex);
}
}
2.2 类结构书写规范

2.2.1 资源列表:

资源列表按以下次序排列:

序列一:Java 标准类(Java standard classes):java.*.

序列二:Java 扩展类(Java extension classes):javax.*.

序列三:第三方厂商类(Third-party classes)

序列四:应用类(Application classes.)

Example:不好的资源列表:
import java.util.*;
import javax.swing.*;
import java.awt.event*;
import com.gensym.com.*;
import javax.swing.table.*;
import com.pv.jfcx.*;
import java.awt.*;
import com.melthorn.util.*;
Example:好的资源列表

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 9

import java.awt.*;
import java.awt.event*;
import java.util.*;
import javax.swing.table.*;
import com.gensym.com.*; // BeanXporter
import com.pv.jfcx.*; // ProtoView
import com.melthorn.util.*; // Utilities
Example:好的资源列表(推荐)
// Java classes
import java.awt.*;
import java.awt.event*;
import java.util.*;
import javax.swing.table.*;

// BeanXporter
import com.gensym.com.*;

// ProtoView GUI components


import com.pv.jfcx.*;

// Application classes
import com.melthorn.util.*;
2.2.2 类结构安排:

好的类结构组织比不好的结构组织要让人容易理解和维护方便的多,一般地,类结构组织

安排如下:

序列一:Javadoc 注释或者其他头部注释

序列二:类宣告

类宣告又按:

子序列一:extends

子序列二:implements

子序列三:throws

的顺序排列类的声明。

序列三:成员变量宣告

成员变量又按:

子序列一:Public contstants (final Æ static final).

子序列二:Public variables.

子序列三:Protected constants.
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 10

子序列四:Protected variables.

子序列五:Package constants.

子序列六:Package variables.

子序列七:Private constants.

子序列八:Private variables.

的顺序排列。

注:

1. 对 Public 和 protected 类型变量还要加上 Javadoc 注释

2. 数组类型变量的宣告,格式为:

Object[] array_name = new Object[]

----插入空行(Blank line)----

序列四:造方法

----插入空行(Blank line)----

序列五:方法(按逻辑归类排列)

----插入空行(Blank line)----

序列六:内部类

----插入空行(Blank line)----

序列七: main()方法(自带一个测试 main()方法)

Example:好的类声明书写规范
public class ProductImpl Å 第一行:类名
extends UnicastRemoteObject Å 第二行:父类名(缩进一个 Tab 键)
implements product Å 第三行:接口类名
throws Exception Å 第四行:异常抛出
{
// code..
}
Example:不好的变量声明书写规范:
public class CustomerSearchDialog
extends JDialog
{
private JLabel firstNameLabel = new JLabel();
private JLabel lastNameLabel = new JLabel();
public static final RESULT_SELECT = 1;
private Vector results = new Vector(); // Search results.

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 11

private DefaultTableModel tableModel = new DefaultTableModel();


public static final RESULT_CANCEL = 0;
// ...
}
Example:好的变量声明书写规范:
/**
* ...comment
*/
public class CustomerSearchDialog
extends JDialog
{
/**
* Indicates that search was cancelled; returned by showDialog() when
* user clicks cancel button.
*/
public static final RESULT_CANCEL = 0;

/**
* Indicates that a customer was selected; returned by showDialog() when
* user clicks select button.
*/
public static final RESULT_SELECT = 1;

private Vector results = new Vector(); // Search results.


private DefaultTableModel tM = new DefaultTableModel(); // Grid model.

// GUI fields. [JBuilder]


private JLabel firstNameLabel = new JLabel();
private JLabel lastNameLabel = new JLabel();
// ...
}
2.3 方法结构书写规范

规则一:在方法的头部必须有 Javadoc 注释或者类似的注释.

规则二:如果多于 3 个以上的参数,分行书写

规则三:不要在方法名和开括号(“(“)间留空格

规则四:在关括号(“)”)和开大括号间(“{“}保留空格

Example: 好的方法宣告书写规范:
public ProductImpl(String n, Å 当参数有 3 个以上时,分行书写
int s,
int age1
…)
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 12

{
// code
}
Example:坏的方法结构书写规范:
public int getTypeCount (String custType)
{
...
}
static public getInstance(){ ... };
public void showRange()
throws RangeException
{
...
}
Example:好的方法结构书写规范:
/**
* Calculate the consumption coefficient.
*/
public float calculateConsumptionCoefficient(int base,
float variance,
int iterations)
throws RangeException
{
// ...
}
2.4 语句行书写规范

方法或类实例化:
ProductImpl products = new ProductIm (“String 1”, Å 参数超过 3 个,分行书写
0,
200,
…);
2.5 SQL 语句书写规范:

规则一:查询字符串变量统一命名为: query

书写规范:
query = “SELECT Å SQL 关键字大写
name, Å 字段名分行书写
age,
sex
FROM
User Å 表名首字母大写
WHERE
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 13

age > 20 Å 查询条件分行书写


AND
age < 18
ORDER BY
age”;

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 14

Chapter 3 常用方法命名标准
为确保方法名(method name)具有语义的一致性,确保动词能准确的描述特殊行为的特征,下

列表格概括了标准的必要动词及其适当的用法。

动词 用法 举例 反义词

add<ElementName> 增加一个新元素到存储器(list,或 void addUser(Person one) remove

者数组,列表,迭代器等等),如 void addMoney(……)

果伺服端还要履行对数据的确认,

当确认失败的时候要抛出一个异

常(InvalidValueException 或者等

效异常)。如果不允许复制一个元

素,或者一个特殊的元素已经包含

在存储器里,也要抛出一个异常

(DuplicateValueException 或等

效异常)。如果伺服端需要计算 ID

提供给终端将来使用,就要返回方

法的值,否则,这是一个

无返回值的公共方法。

check

close<ObjectType> 终止一个连接对话。 void closeSocket() open

void closeConn()

create<ObjectType> 创建一个 ObjectType 的对象。如 void createGroup() delete

果需要,返回它。伺服端也许需要

对数据确认,如同上面讨论 add

方法那样也要抛出一个异常

(ObjectCreationException 或等

效异常)。

delete<ObjectType) 删除一个 ObjectType 类型的对 void deleteGroup()

象,这个对象被 create 方法创建

过。

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 15

destroy 调用完一个对象后要用 destroy 方 void destroy()

法销毁它。伺服端实现一个与

release 类似的方法

disable 暂停对当前对象的访问。唯一可用 boolean disable(); enable

的方法是:enable.

disable<ObjectType> 暂停访问一个特定的特征 boolean disableUser(….); enable<

(property)、方法或者对象。 boolean disableOption(); >

enable 恢复访问当前对象,假如它被暂停 boolean enable(); disable

了。

enable<ObjectType> 恢复访问一个特定的特征 boolean enableUser(….); disable<

(property)、方法或者对象。 boolean enableOption(); >

get<PropertyName> 返回一个特征的值。如果这个特征 public String getAuthor(); set

没有设置(set)值(比如:没有默认

的初始值),就会抛出一个异常

(PropertyNotSetException 或者其

他等价异常).

has<PropertyName> 测试一个特征的值是否设置的简 boolean hasAuthor();

单方法。如果设置返回 true,否则

返回 false.

is<Characteristic> 确认一个对象的特征,如果是返回 boolean isLocked();

true,否则返回 false.

list<PropertyName> 当应用了一个 list(数组或者序列), list listCurrentActivities();

返回特征的值。

open<ObjectType> 初始化一个对象(File,Socket,Date Socket openSocket(….) close

-base)对话并返回连接标识符。如

果操作失败抛出一个异常。

(ConnectionException 或者同价

异常)

remove<ElementName> 从 list 中移除一个元素。这个方法 void removeUser(User one) add

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 16

将接受一个或多个用来表识该元 thrown ………

素唯一性的参数。如果这个元素不

在 list 里 , 将 抛 出 一 个 异 常 。

(NoSuchElementException 或 者

同价异常)

set<PropertyName> 设置一个特征(property)的值。也 void setAuthor(String ….) get

许伺服端需要对数据确认,如果确 thrown …….

认失败将抛出一个异常。

(InvalidValueException 或者等价

异常)

tryGet<PropertyName> 类 似 方 法 get, 除 了 返 回 一 个 boolean tryGetAuthor()

boolean(如 果这个 特 征 property

没有设置’set’—比抛出一个异常

要好),可以把这个特征作为外部参

数返回.

validate 验证当前对象的有效性,将所有错 boolean validate(

误作为日志到 ErrorSequence(错 ErrorSequence errors)

误序列,模块中定义)

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 17

Chapter 4 类、方法、变量命名缩写规范
一般方法命名遵循:

规则一:<动词缩写(首字母小写)>+<名词(首字母大写)>

变量命名:

普通变量遵循:

规则二:<前缀缩写(首字母小写)>+< 名词(首字母大写)>

final 变量遵循:

规则三:<F>+<”_”>+<变量名(全大写,各单词间用”_”连接)>

Example:

public final int F_TIME_INTERVAL = 30;

static 变量遵循:

规则四:<S>+<”_”>+<变量名(首字符大写,各单词间用”_”连接)>

Example:

private static S_Total_Num = 12;

final 且 static 变量遵循:

规则五:<FS>+<”_”>+<变量名(全大写,各单词间用”_”连接)>

Example:

private final static FS_TOTAL_NUM = 12;

定义变量、类名时尽量的使用下列词汇表中的缩写:

缩 写 全 拼 中 文 义

Abv Above 在…之上

Absol Absolute 绝对的

Acpt Accept 接受、适合

Acct Account 帐号

Acc Access 访问

Actn Action 行动、动作

Actv Active 活动地

Addr Address 地址

Adv Addvance 高级地

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 18

Appl Application 应用

Buf Buffer 缓冲

Cb Callback 回叫、复查

Cnf Confirmation 确认

Comm Communication 通讯

Comp Component 构件、组件

Cond Condition 条件

Conf Configuration 配置、结构

Conn Connection 连接

Db Database 数据库

Desc Description 描述

Deta Detail 详细描述

Dest Destination 目的

Dev Device 装置、设备

Diag Diagnostics 诊断

Dir Directory 目录

Env Environment 环境

Err Error 错误

Hex Hexadecimal 16 进制

Id Identifier 标识符

Impl Implementation 执行、实现

Inpt Input 输入

Ind Indication 指示、迹象

Indent Indentation 缩进

Init Initialize 初始化

Intro Introduction 介绍、初步

It Iterator 迭代

LineNo Line Number 行序号

Max Maximum 最大

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 19

Mem Memory 记忆体

Mgmt Managment 管理

Mgr Manager 管理员、经理

Min Minimum 最小

Msg Message 信息、消息

MsgQ Message Queue 消息队列

Mux Multiplexer 多路、复路

Ne Network element 网络元素

NumOf Number Of

Obj Object 对象、物件、目标

Op Operation 操作、运算

Outpt Output 输出

Param Parameter 参数

Pos Position 位置

Prev Previous 在….之前

Proc Procedure 过程

Prog Program 程序

Prj Project 项目

Ptr Pointer 指针、指示器

Recv Receive 收到、接收

Ref Reference 涉及、参考、引用

Reg Register 注册

Req Request 请求

Resp Response 回应

Sec Seconds 秒

Seq Sequence 序列

Srv Server 服务端

Tmp Temporary 临时、暂时

Val Value 值

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 20

Vec Vector 向量、矢量

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 21

Chapter 5 常用 AWT/SWING 类命名标准


Awt/Swing 组件名一般作为定语放在功能前,比如: btnOK 表示为一个确认按钮.如果是 Swing

类命名则在组件缩写后加一个小写的 x,比如 btnxOK 表明是 Swing 组件 Jbutton 按钮。下列

表格中未提到的,均使用全名,比如:DialogMsg 表示一个信息提示对话框。

缩 写 类 名 中 文 义

btn Button 按钮

frm Frame 框架

lab Label 标签

mnu Menu 菜单

mnuBar MenuBar 菜单条

mnuItem MenuItem 菜单项

pane Panel 面板

scroBar scrollBar 滚动条

scroPane ScrollPanel 滚动条面板

txtArea TextArea 文本输入区域

txt TextField 文本输入区框

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 22

Appendix A JDK 开发工具包使用说明


Java 开发工具包是 Sun 公司的 Java Software 产品。他可以非常方便的开发和调试 JAVA 应用

程序。下面就详细介绍这些工具的使用:

z rmic

功能说明:

rmic 为远程对象生成 stub 和 skeleton。

语法:

rmic [ options ] package-qualified-class-name(s)

补充说明:

rmic 编译器根据编译后的 Java 类(含有远程对象实现)名,为远程对象生成

stub 和 skeleton(远程对象是指实现 java.rmi.Remote 接口的对象)。在 rmic 命令

中所给的类必须是经 javac 命令成功编译且是完全包限定的类。

命令选项:

-classpath[路径]

指 定 rmic 用 于 查 询 类 的 路 径 。 如 果 设 置 了 该 选 项 , 它 将 覆 盖 缺 省 值 或

CLASSPATH 环境变量。目录用冒号分隔。

-d[目录]

指定类层次的根目录。此选项可用来指定 stub 和 skeleton 文件的目标目录。

-depend

使编译器考虑重新编译从其它类引用的类。 一般来说,它只重新编译从源代码引

用的遗漏或过期的类。

-g

允许生成调试表格。调试表格含有行号和局部变量的有关信息,即 Java 调试工

具所使用的信息。缺省情况下,只生成行号。

-J 与 -D

选项联用,它将紧跟其后的选项( -J 与 -D 之间无空格)传给 java 解释器。

-keepgenerated

为 stub 和 skeleton 文件保留所生成的 .java 源文件,并将这些源文件写到

与 .class 文件相同的目录中,如果要指定目录,则使用 -d 选项。

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 23

-nowarn

关闭警告。如果使用该选项,则编译器不输出任何警告信息。

-show

显示 rmic 编译器的 GUI(图形用户界面)。输入一个或多个包限定类名(以空

格分隔),并按回车键或“显示”按钮,创建 stub 和 skeleton。

-vcompat

(缺省值)创建与 JDK 1.1 和 1.2 stub 协议版本都兼容的 stub 和 skeleton。

-verbose

使编译器和链接器输出关于正在编译哪些类和正在加载哪些类文件的信息。

-v1.1

创建 JDK 1.1 stub 协议版本的 stub 和 skeleton。

-v1.2

只创建 JDK 1.2 stub 协议版本的 stub。

z rmid

功能说明:

rmid 启动激活系统守护进程,以便能够在 Java 虚拟机上注册和激活对象。

语法:

rmid [-port port] [-log dir]

补充说明:

rmid 工具启动激活系统守护进程。必须先启动激活系统守护进程,才能向激活系

统注册可被激活的对象或在 Java 虚拟机上激活可被激活的对象。

命令选项:

-C<某些命令行选项>

指定一个选项,在创建每个 rmid 的子守护进程(激活组)时,该选项以命令行

参数的形式传给该子守护进程。

-log[目录]

指定目录的名称,激活系统守护进程在该目录中写入其数据库及相关信息。缺省

状态下,将在执行 rmid 命令的目录中创建一个 log 目录。

-port[端口]

指定 rmid 的 注 册 服 务 程 序 所 使 用 的 端 口 。 激 活 系 统 守 护 进 程 将
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 24

ActivationSystem 与该注册服务程序中的名称 java.rmi.activation.ActivationSy-

-stem 捆绑在一起。

-stop

停止 -port 选项所指定端口上的当前 rmid 调用。若未指定端口,则将停止在端

口 1098 上运行的 rmid。

z rmiregistry

功能说明:

rmiregistry 命令可在当前主机的指定端口上启动远程对象注册服务程序。

语法:

rmiregistry [port]

补充说明:

rmiregistry 命令在当前主机的指定 port 上创建并启动远程对象注册服务程序。

如果省略 port,则注册服务程序将在 1099 端口上启动。rmiregistry 命令不产生

任何输出而且一般在后台运行。远程对象注册服务程序是自举命名服务。主机上

的 RMI 服务器将利用它将远程对象绑定到名字上。客户机即可查询远程对象并

进行远程方法调用。注册服务程序一般用于定位应用程序需调用其方法的第一个

远程对象。该对象反过来对各应用程序提供相应的支持,用于查找其它对象。

java.rmi.registry.LocateRegistry 类的方法可用于在某台主机或主机和端口上获

取注册服务程序操作。java.rmi.Naming 类的基于 URL 的方法将对注册服务程

序进行操作,并可用于查询远程对象、将简单(字符串)名称绑定到远程对象、

将新名称重新绑定到远程对象(覆盖旧绑定)、取消远程对象的绑定以及列出绑定

在注册服务程序上的 URL。

z serialver

功能说明:

serialver 命令返回 serialVersionUID。

语法:

serialver [ 命令选项 ]

补充说明:

serialver 以适于复制到演变类的形式返回一个或多个类的 serialVersionUID。不

带参数调用时,它输出用法行。
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 25

命令选项:

-show

显示一个简单的用户界面。输入完整的类名并按回车键或“显示”按钮可显示

serialVersionUID。

z jarsigner

功能说明:

为 Java 归档 (JAR) 文件产生签名,并校验已签名的 JAR 文件的签名。

语法:

jarsigner [ 命令选项 ] jar-file alias

jarsigner -verify [ 命令选项 ] jar-file

补充说明:

jarsigner 工具用于两个目的:

1 为 Java 归档 (JAR) 文件签名

2 校验已签名的 JAR 文件的签名和完整性

命令选项:

-keystore[url]

指定密钥仓库的 URL。缺省值是用户的宿主目录中的 .keystore 文件,它由系统

属性“user.home”决定。

-storetype[storetype]

指 定 要 被 实例 化 的 密 钥仓 库 类 型 。默 认 的 密 钥仓 库 类 型 是安 全 属 性 文件中

"keystore.type" 属性值所指定的那个类型,由 java.security.KeyStore 中的静态

方法 getDefaultType 返回。

-storepass[password]

指定访问密钥仓库所需的口令。这仅在签名(不是校验)JAR 文件时需要。在这

种情况下,如果命令行中没有提供 -storepass 选项,用户将被提示输入口令。

-keypass[password]

指定用于保护密钥仓库项(由命令行中指定的别名标出)的私钥的口令。使用

jarsigner 为 JAR 文件签名时需要该口令。如果命令行中没有提供口令,且所需

的口令与密钥仓库的口令不同,则将提示用户输入它。

-sigfile[file]
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 26

指定用于生成 .SF 和 .DSA 文件的基本文件名。

-signedjar[file]

指定用于已签名的 JAR 文件的名称。

-verify

如果它出现在命令行中,则指定的 JAR 文件将被校验,而不是签名。如果校验

成功,将显示“jar verified”。如果试图校验未签名的 JAR 文件,或校验被不支

持的算法(Example 未安装 RSA 提供者时使用的 RSA)签名的 JAR 文件,则

将有如下显示: "jar is unsigned. (signatures missing or not parsable)" 。

-certs

如果它与 -verify 和 -verbose 选项一起出现在命令行中,则输出将包括 JAR 文

件的每个签名人的证书信息。

-verbose

如果它出现在命令行中,则代表“verbose”模式,它使 jarsigner 在 JAR 签名

或校验过程中输出额外信息。

-internalsf

过去,JAR 文件被签名时产生的 .DSA(签名块)文件包含一个同时产生的 .SF

文件(签名文件)的完整编码副本。这种做法已被更改。为了减小输出 JAR 文

件的整个大小,缺省情况下 .DSA 文件不再包含 .SF 文件的副本。但是如果

-internalsf 出现在命令行中,将采用旧的做法。该选项主要在测试时有用;实际

上不应使用它,因为这样将消除有用的优化。

-sectionsonly

如果它出现在命令行中,则 JAR 文件被签名时生成的 .SF 文件(签名文件)将

不包括含有整个清单文件的散列的头。它仅包含 与 JAR 中每个单独的源文件相

关的信息和散列。该选项主要在测试时有用;实际上不应使用它,因为这样将消

除有用的优化。

-J[javaoption]

将指定的 javaoption 串直接传递到 Java 解释器。((jarsigner 实际上是解释器

的一个 “wrapper”)。该选项不应含有任何空格。它有助于调整执行环境或内存

使用。要获得可用的解释器选项的清单,可在命令行键入 java -h 或 java -X。

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 27

z keytool

功能说明:

管理由私钥和认证相关公钥的 X.509 证书链组成的密钥仓库(数据库)。还管理

来自可信任实体的证书。

语法:

keytool [ 命令 ]

补充说明:

keytool 是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关

证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据

完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。

z native2ascii

功能说明:

将含有本地编码字符(既非 Latin1 又非 Unicode 字符)的文件转换为 Unicode

编码字符的文件。

语法:

native2ascii [options] [inputfile [outputfile]]

补充说明:

Java 编译器和其它 Java 工具只能处理含有 Latin-1 和/或 Unicode 编 码

(udddd 记号)字符的文件。native2ascii 将含有其它字符编码的文件转换成含

Latin-1 和/或 Unicode 编码字符的文件。若省略 outputfile,则使用标准输出设

备输出。此外,如果也省略 inputfile,则使用标准输入设备输入。

命令选项:

-reverse

执行相反的操作:将含 Latin-1 和/或 Unicode 编码字符的文件转换成含本地编

码字符的文件。

-encoding[encoding_name]

指定转换过程使用的编码名称。缺省的编码从系统属性 file.encoding 中得到。

z appletviewer

功能说明:

Java applet 浏览器。appletviewer 命令可在脱离万维网浏览器环境的情况下运


Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 28

行 applet。

语法:

appletviewer [ threads flag ] [ 命令选项 ] urls ...

补充说明:

appletviewer 命令连接到 url 所指向的文档或资源上,并在其自身的窗口中显示

文 档 引 用 的 每 个 applet 。 注 意 : 如 果 url 所 指 向 的 文 档 不 引 用 任 何 带 有

OBJECT、EMBED 或 APPLET 标记的 applet,那么 appletviewer 就不做任

何事情。

命令选项:

-debug

在 Java 调试器 jdb 中启动 appletviewer,使您可以调试文档中的 applet。

-encoding[编码名称]

指定输入 HTML 文件的编码名称。

-J[javaoption]

将 javaoption 字符串作为单个参数传给运行 appletviewer 的 Java 解释器。参

数不能含有空格。由多重参数组成的字符串,其中的每个参数都必须以前缀 -J 开

头,该前缀以后将被除去。这在调整编译器的执行环境或内存使用时将很有用。

z extcheck

功能说明:

extcheck 检测目标 jar 文件与当前安装方式扩展 jar 文件间的版本冲突。

语法:

extcheck [ -verbose ] targetfile.jar

补充说明:

extcheck 实用程序检查指定 Jar 文件的标题和版本与 JDK TM 软件中所安装

的扩展是否有冲突。在安装某个扩展前,可以用该实用程序查看是否已安装了该

扩展的相同版本或更高的版本。

extcheck 实 用 程 序 将 targetfile.jar 文 件 清 单 的 specification-title 和

specification-version 头与当前安装在扩展目录下所有 Jar 文件的相对应的头进

行比较(缺省扩展目录为 jre/lib/ext)。extcheck 实用程序比较版本号的方式与

java.lang.Package.isCompatibleWith 方法相同。若未检测到冲突,则返回代码
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 29

为 0。如果扩展目录中任何一个 jar 文件的清单有相同的 specification-title 和相

同的或更新的 specification-version 号,则返回非零错误代码。如果 targetfile.jar

的清单中没有 specification-title 或 specification-version 属性,则同样返回非零

错误代码。

命令选项:

-verbose

对扩展目录中的 Jar 文件进行检查时,列出文件。此外,还报告目标 jar 文件的

清单属性及所有冲突的 jar 文件。

z jar

功能说明:

Java 归档工具

语法:

jar [ 命令选项 ] [manifest] destination input-file [input-files]

补充说明:

jar 工具是个 java 应用程序,可将多个文件合并为单个 JAR 归档文件。jar 是个多

用途的存档及压缩工具,它基于 ZIP 和 ZLIB 压缩格式。然而,设计 jar 的主要目

的是便于将 java applet 或应用程序打包成单个归档文件。将 applet 或应用程序的

组件(.class 文件、图像和声音)合并成单个归档文件时,可以用 java 代理(如浏览

器)在一次 HTTP 事务处理过程中对它们进行下载,而不是对每个组件都要求一个

新连接。这大大缩短了下载时间。jar 还能压缩文件,从而进一步提高了下载速度。

此外,它允许 applet 的作者对文件中的各个项进行签名,因而可认证其来源。jar

工具的语法基本上与 tar 命令的语法相同。

命令选项:

-c

在标准输出上创建新归档或空归档。

-t

在标准输出上列出内容表。

-x[file]

从标准输入提取所有文件,或只提取指定的文件。如果省略了 file,则提取所有文

件;否则只提取指定文件。
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 30

-f

第二个参数指定要处理的 jar 文件。在-c(创建)情形中,第二个参数指的是要创建

的 jar 文件的名称(不是在标准输出上)。在-t(表(或-x(抽取)这两种情形中,第二个

参数指定要列出或抽取的 jar 文件。

-v

在标准错误输出设备上生成长格式的输出结果。

-m

包括指定的现有清单文件中的清单信息。用法举例:“jar cmf myManifestFile

myJarFile *.class”

-0

只储存,不进行 ZIP 压缩。

-M

不创建项目的清单文件。

-u

通过添加文件或更改清单来更新现有的 JAR 文件。Example:“jar -uf foo.jar

foo.class”将文件 foo.class 添加到现有的 JAR 文件 foo.jar 中,而“jar umf

manifest foo.jar”则用 manifest 中的信息更新 foo.jar 的清单。

-C

在执行 jar 命令期间更改目录。Example:


“jar -uf foo.jar -C classes *”将 classes

目录内的所有文件加到 foo.jar 中,但不添加类目录本身。

程序示例:

1 将当前目录下所有 CLASS 文件打包成新的 JAR 文件:

jar cf file.jar *.class

2 显示一个 JAR 文件中的文件列表

jar tf file.jar

3 将当前目录下的所有文件增加到一个已经存在的 JAR 文件中

jar uvf file.jar *

z javac

功能说明:

Java 程序语言的编译器,将 java 程序转成 bytecode 的 class 文件。


Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 31

语法:

javac [ 命令选项 ] [ 源文件名 ]

命令选项:

-g

在 class 文件中假如所有调试用的信息

-g:none

不在 class 文件中假如所有调试用的信息

-O(英文大写的 O)

对 class 文件做优化处理,同-g 参数一样会增加 class 文件大小。

-nowarn

不显示 Warning 的警告信息。有时在程序中会使用一些已经废弃的方法时,javac

会显示一些警告信息。

-verbose

在屏幕上显示 javac 目前所处理的进度和处理每个类所花的时间.

-deprecation

在屏幕上显示程序代码中哪一行指令用到了已经废弃的方法。

-classpath<path>

指定程序中所用到相关类的路径位置。如果没有此参数,则 javac 会去系统变量

里去寻找 classpath。

-sourcepath<path>

源文件所在位置

-bootclasspath<path>

指定这个 class 文件执行时所要用到的 Java 虚拟机。默认是 JVM.

-d <direcotry>

指定编译出来的 class 文件存放的路径位置。

-encoding<encoding>

指定文字编码的方式。如果 java 程序中用到了非英语的文字,则可加上该参数。

-target<version>

指定所编译出来的 class 文件所需要的虚拟机器版本。

z javadoc
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 32

功能说明:

Java API 文档生成器从 Java 源文件生成 API 文档 HTML 页。

语法:

javadoc [ 命令选项 ] [ 包名 ] [ 源文件名 ] [ @files ]

其中[ 包名 ]为用空格分隔的一系列包的名字,包名不允许使用通配符,如(*)。

[ 源文件名 ]为用空格分隔的一系列的源文件名,源文件名可包括路径和通配符,

如(*)。[ @files ]是以任何次序包含包名和源文件的一个或多个文件。

补充说明:

Javadoc 解析 Java 源文件中的声明和文档注释,并产生相应的 HTML 页缺省),

描述公有类、保护类、内部类、接口、构造函数、方法和域。

在实现时,Javadoc 要求且依赖于 java 编译器完成其工作。Javadoc 调用部分

javac 编译声明部分,忽略成员实现。它建立类的内容丰富的内部表示,包括类层

次和“使用”关系,然后从中生成 HTML。Javadoc 还从源代码的文档注释中获

得用户提供的文档。

当 Javadoc 建立其内部文档结构时,它将加载所有引用的类。由于这一点,

Javadoc 必须能查找到所有引用的类,包括引导类、扩展类和用户类。

命令选项:

-overview i>path/filename

指定 javadoc 应该从 path/filename 所指定的“源”文件中获取概述文档,并将它

放 到 概 述 页 中 ( overview-summary.html )。 其 中 path/filename 是 相 对 于

-sourcepath 的相对路径名。

-public

只显示公有类及成员。

-protected

只显示受保护的和公有的类及成员。这是缺省状态。

-package

只显示包、受保护的和公有的类及成员。

-private

显示所有类和成员。

-help
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 33

显示联机帮助,它将列出这些 javadoc 和 doclet 命令行选项。

-doclet class

指定启动用于生成文档的 docle 的类文件。该 doclet 定义了输出的内容和格式。

如果未使用-doclet 选项,则 javadoc 使用标准 doclet 生成缺省 HTML 格式。该类

必须包含 start(Root)法。该启动类的路径由 -docletpath 选项定义。

-docletpath classpathlist

指定 doclet 类文件的路径,该类文件用-doclet 选项指定。如果 doclet 已位于搜索

路径中,则没有必要使用该选项。

-1.1

生成具有用 Javadoc 1.1 生成的文档的外观和功能的文档。也就是说,页的背景

为灰色,用图像做页眉,使用 bullet 列表而不是表格,具有单层目的目录结构,

不包含继承 API,不使用 HTML 框架,并且不支持内部类。该选项还自动将索引

分割成每个字母一个文件。如果想要这种外观,则该选项比 javadoc 1.1 优越之处

等于修正了一些错误。

-sourcepath sourcepathlist

当将包名传递到 javadoc 命令中时,指定定位源文件(.java)的搜索路径。注意

只有当用 javadoc 命令指定包名时才能使用 sourcepath 选项 -- 它将不会查找传

递到 javadoc 命令中的.java 文件。如果省略-sourcepath,则 javadoc 使用类路径

查找源文件。

-classpath classpathlist

指定 javadoc 将在其中查找引用类的路径 -- 引用类是指带文档的类加上它们引

用的任何类。Javadoc 将搜索指定路径的所有子目录。classpathlist 可以包括多

个路径,彼此用逗号分隔。

-bootclasspath classpathlist

指定自举类所在路径。它们名义上是 Java 平台类。这个 bootclasspath 是 Javadoc

将用来查找源文件和类文件的搜索路径的一部分。在 classpathlist 中用冒号(:)

分隔目录。

-extdirs dirlist

指定扩展类所在的目录。它们是任何使用 Java 扩展机制的类。这个 extdirs 是

Javadoc 将用来查找源文件和在文件的搜索路径的一部分。在 dirlist 中用冒号(:)


Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 34

分隔目录。

-verbose

在 javadoc 运行时提供更详细的信息。不使用 verbose 选项时,将显示加载源文

件、生成文档(每个源文件一条信息)和排序的信息。verbose 选项导致打印额

外的信息,指定解析每个 java 源文件的毫秒数。

-locale language_country_variant

指定 javadoc 在生成文档时使用的环境。

-encoding name

指定源文件编码名,ExampleEUCJIS/SJIS。如果未指定该选项,则使用平台缺

省转换器。

-J[flag]

将 flag 直接传递给运行 javadoc 的运行时系统 java。注意在 J 和 flag 之间不能有

空格。

标准 Doclet 提供的选项:

-d directory

指定 javadoc 保存生成的 HTML 件的目的目录。省略该选项将导致把文件保存到

当前目录中。其中 directory 可以是绝对路径或相对当前工作目录的相对路径。

-use

对每个带文档类和包包括一个“用法”页。该页描述使用给定类或包的任何 API 的

包、类、方法、构造函数和域。对于给定类 C,使用类 C 的任何东西将包括 C

的子类、声明为 C 的域、返回 C 的方法以及具有 C 类型参数的方法和构造函

数。

-version

在生成文档中包括 @version 文本。缺省地将省略该文本。

-author

在生成文档中包括 @author 文本。

-splitindex

将索引文件按字母分割成多个文件,每个字母一个文件,再加上一个包含所有以

非字母字符开头的索引项的文件。

-windowtitle[title]
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 35

指定放入 HTML <title> 标记中的标题。它将出现在窗口标题栏中和为该页创建

的任何浏览器书签(最喜爱的位置)中。该标题不应该包含任何 HTML 标记,

因为浏览器将不能正确解释它们。在 title 中的任何内部引号必须转义。如果省略

-windowtitle,则 Javadoc 对该选项使用 -doctitle 的值。

-doctitle[title]

指定放置在靠近概述概览文件顶部的标题。该标题将作为一级标题,居中地直接

放在导航栏下面。title 可包含 html 标记和空格,但是如果这样,则必须用引号

将它括起。在 title 中的任何内部引号必须转义。

-title[title]

该选项不再存在。它仅存在于 Javadoc 1.2 的 Beta 版中。它已重命名为

-doctitle。重命名该选项是为了更清楚地表示它定义文档标题而不是窗口标题。

-header[header]

指定放置在每个输出文件顶部的页眉文本。该页眉将放在上部导航栏的右边。

header 可包含 HTML 标记和空格,但是如果这样则必须用引号将它括起。在

header 中的任何内部引号必须转义。

-footer[footer]

指定放置在每个输出文件底部的脚注文本。脚本将放置在下部导航栏的右边。

footer 可包含 html 标记和空格,但是如果这样,则必须用引号将它括起。在

footer 中的任何内部引号必须转义。

-bottom[text]

指定放置在每个输出文件底部的文本。该文本将放置在页底,位于下部导航栏的

下面。其中 text 可包含 HTML 标记和空格,但是如果这样,则必须用引号将它

括起。在 text 中的任何内部引号必须转义。

-link[docURL]

创建链接指向已用 javadoc-生成的外部引用类的文档。参数 docURL 是想要链接

到的 javadoc-生成的外部文档的 URL。该位置可以是相对的或绝对的 URL。

-linkoffline[docURL][packagelistURL]

该选项为外部引用类名字创建指向文档的链接。

-group[groupheading]packagepattern:packagepattern:...

将概述页上的包分成指定的组,每组一个表格。用不同的 -group 选项指定每个


Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 36

组。各组按命令行中指定的次序出现在页面上。组内的包按字母排序。对于给定

-group 选 项 , 与 packagepattern 表 达 式 列 表 匹 配 的 包 出 现 在 标 题 为

groupheading 的表格中。

-nodeprecated

防止在文档中生成任何不鼓励使用的 API。它执行-nodeprecatedlist 所做的事

情,并且它不在文档其余部分生成任何不鼓励使用的 API。当编写代码并不想被

不鼓励使用的代码分心时,这是非常有用的。

-nodeprecatedlist

防止在生成文件中包含不鼓励使用的 API 列表(deprecated-list.html)并防止在

导航栏中包含该页的链接。
(但是,javadoc 继续在文档其余部分生成不鼓励使用

的 API。) 如果源代码未包含不鼓励使用的 API,并且想要导航栏更干净,则它

是非常有用的。

-notree

在生成文档中忽略类/接口层次。缺省地,将产生该层次。

-noindex

在生成文档中忽略索引。缺省地,将产生索引。

-nohelp

在输出的每页顶部和底部的导航栏中忽略“帮助”链接。

-nonavbar

防止产生导航栏、页眉和脚注,否则它们将出现在生成页的顶部和底部。它对

“bottom”选项没有影响。当只对内容感兴趣并且没有必要导航时,Example 仅

将文件转换成 PostScript 或 PDF 以进行打印,-nonavbar 选项是非常有用的。

-helpfile[path/filename]

指定顶部和底部导航栏中“帮助”链接所链接到的替代帮助文件 path/filename 的

路 径 。不 使用 该 选项 时, Javadoc 自 动 创建 帮助 文 件 help-doc.html ,它 在

Javadoc 中硬编码。该选项使得可覆盖这种缺省情况。其中 filename 可以是任

何名字,不局限于 help-doc.html -- Javadoc 将相应调整导航栏中的链接。

-stylesheetfile[path/filename]

指定替代 HTML 样式表单文件的路径。不使用该选项时,Javadoc 将自动创建

样式表单文件 stylesheet.css,它在 Javadoc 中硬编码。该选项使得可覆盖这种


Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 37

缺省情况。其中 filename 可以是任何名字,不局限于 stylesheet.css。

-docencoding[name]

指定输出 HTML 文件的编码方式。

z javah

功能说明:

C 头文件和 Stub 文件生成器。javah 从 Java 类生成 C 头文件和 C 源文件。

这些文件提供了连接胶合,使 Java 和 C 代码可进行交互。

语法:

javah [ 命令选项 ] fully-qualified-classname. . .

javah_g [ 命令选项 ] fully-qualified-classname. . .

补充说明:

javah 生成实现本地方法所需的 C 头文件和源文件。C 程序用生成的头文件和

源文件在本地源代码中引用某一对象的实例变量。.h 文件含有一个 struct 定义,

该定义的布局与相应类的布局平行。该 struct 中的域对应于类中的实例变量。

头文件名以及在头文件中所声明的结构名都来源于类名。如果传给 javah 的类是

在某个包中,则头文件名和结构名前都要冠以该包名。下划线 (_) 用作名称分隔

符。

缺省情况下,javah 为每个在命令行中列出的类都创建一个头文件,且将该文件

放在当前目录中。用 -stubs 选项创建源文件。用 -o 选项将所有列出类的结果串

接成一个单一文件。

缺省情况下,javah 为每个在命令行中列出的类都创建一个头文件,且将该文件

放在当前目录中。用 -stubs 选项创建源文件。用 -o 选项将所有列出类的结果串

接成一个单一文件。

命令选项:

-o[输出文件]

将命令行中列出的所有类的头文件或源文件串接到输出文件中。-o 或 -d 两个选

项只能选择一个。

-d[目录]

设置 javah 保存头文件或 stub 文件的目录。-d 或 -o 两个选项只能选择一个。

-stubs
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 38

使 javah 从 Java 对象文件生成 C 声明。

-verbose

指明长格式输出,并使 javah 将所生成文件的有关状态的信息输出到标准输出设

备中。

-help

输出 javah 用法的帮助信息。

-version

输出 javah 的版本信息。

-jni

使 javah 创建一输出文件,该文件包含 JNI 风格的本地方法函数原型。这是缺

省输出,所以 -jni 的使用是可选的。

-classpath[路径]

指 定 javah 用 来 查 询 类 的 路 径 。 如 果 设 置 了 该 选 项 , 它 将 覆 盖 缺 省 值 或

CLASSPATH 环境变量。目录用冒号分隔。

-bootclasspath[路径]

指定加载自举类所用的路径。缺省情况下,自举类是实现核心 Java 平台的类,

位于 jrelibt.jar 和 jrelibi18n.jar 中。

-old

指定应当生成旧 JDK1.0 风格的头文件。

-force

指定始终写输出文件。

z javap

功能说明:

Java 类文件解析器。

语法:

javap [ 命令选项 ] class. . .

补充说明:

javap 命令用于解析类文件。其输出取决于所用的选项。若没有使用选项,javap

将输出传递给它的类的 public 域及方法。javap 将其输出到标准输出设备上。

命令选项:
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 39

-help

输出 javap 的帮助信息。

-l

输出行及局部变量表。

-b

确保与 JDK 1.1 javap 的向后兼容性。

-public

只显示 public 类及成员。

-protected

只显示 protected 和 public 类及成员。

-package

只显示包、protected 和 public 类及成员。这是缺省设置。

-private

显示所有类和成员。

-J[flag]

直接将 flag 传给运行时系统。

-s

输出内部类型签名。

-c

输出类中各方法的未解析的代码,即构成 Java 字节码的指令。

-verbose

输出堆栈大小、各方法的 locals 及 args 数。

-classpath[路径]

指定 javap 用来查找类的路径。如果设置了该选项,则它将覆盖缺省值或

CLASSPATH 环境变量。目录用冒号分隔。

- bootclasspath[路径]

指定加载自举类所用的路径。缺省情况下,自举类是实现核心 Java 平台的类,

位于 jrelibt.jar 和 jrelibi18n.jar 中。

-extdirs[dirs]

覆盖搜索安装方式扩展的位置。扩展的缺省位置是 jrelibext。
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 40

Appendix B JAR Archive 进阶


资料来源: www.yesky.com

资料作者: 何先睿

先对 JAR 作一下简要介绍,JAR 是一种与平台无关的文档格式,全称为 Java Archive,翻

译成中文叫 Java 归档,咋一看,它相当于一种压缩格式,可以把众多的文档合成一个文件,

就象 ZIP,ACE 等,但它所被赋予的能力远不止这些,

首先,它与平台无关,并且兼容性好,就是说不管是 windows,还是 unix,都是通吃,甚

至是 IE 和 netscape 之间的不兼容,也能轻松化解,这和 java 的精神是很相符合的。

再来,它使用户可将多个 java 小应用程序合并为一个文件作为单个的简单 HTTP 事务下

载到浏览器中,从而大大提高浏览速度,这在越来越讲究速度的 www 世界里是很相当具有诱

惑力的。

它还提供对 applet 作者的认证,这只要对 JAR 进行数字签名便可。

更为精彩的是,如果浏览器信任该认证,那么作为可信任的 applet,它便能访问非信任的

applet 禁止访问的资源,如本地硬盘和网络。

还有一个不似功能的优点,背靠 sun,自然是好事天天有。

总而言之是优点多多,前途无量,从它的诞生开始,它就在 java 的应用中的占着越来越重

要的地位,不久 JAR 将成为分布 java applet 的标准方法。

这么好的东东,是不是有些相见恨晚,那现在便开始为 JAR 的进阶准备一些工具,当然必

要的是 jdk,现在普遍用的版本是 1.3,那么就去下一个吧,sun 的主机太远,速度也一般般,

关键是 e 文的,目录又深。国内有些网站也提供下载的,速度也挺快,在搜索引擎里面查找一

下便有一堆了。最好是准备一个可视化的 java 编程环境,在 windows 平台下推荐 jbuilder4,

Inprise 也就 borland 公司出的,除开资源占得厉害,有些垃圾代码,也挺不错的。至于 jbuilder4

的下载,也还是去搜索一下吧,还有要对 jbuilder 熟悉一下,www.94soft.com 里面有 jbuilder

书籍下载,有兴趣就去下一个看看,挺不错的。

现在开始 JAR 的第一步,jdk 提供了 jar 的工具,就在 java 所在目录的 bin 目录下有一个

jar.exe 的应用程序,可以试着新建一个 jar 文件:

jar cvf test1.jar *.class image

#c 参数表示在标准输出上创建新归档或空归档,

#v 参数表示把添加了一些什么的信息在标准输出上显示,

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 41

#f 参数在这里表示用什么样的 jar 文件名,

在 jbuilder 里面新建一个 JAR 更加方便,wizards 菜单的 archive builder 一步步往下选就

可以了。

为了更好的钻研 JAR,就从在 jbuilder 做个 applet 开始吧,做这样一个东西,在一个面板

上有一个按钮,右键单击按钮将弹出一个菜单。

step 1.新建一个工程 test1.jpr

step 2.再新建一个 applet applet1.Java

setp 3.接下来在面板上摆上一个 java.awt.button,

setp 4.再摆上一个 java.awt.popupMenu,在 popupMenu 的编辑面板输入几个选项。

这样控件摆完了,接下来是写相应的事件,源程序如下:
package test1;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Applet1 extends Applet
{
boolean isStandalone = false;
PopupMenu popupMenu1 = new PopupMenu();
MenuItem menuItem1 = new MenuItem();
MenuItem menuItem2 = new MenuItem();
MenuItem menuItem3 = new MenuItem();
Button button1 = new Button();
/**Get a parameter value*/
public String getParameter(String key, String def)
{
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}

/**Construct the applet*/


public Applet1() {}

/**Initialize the applet*/


public void init()
{
try
{
jbInit();
}

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 42

catch(Exception e)
{
e.printStackTrace();
}
}

/**Component initialization*/
private void jbInit() throws Exception
{
menuItem1.setLabel("1");
menuItem2.setLabel("2");
menuItem3.setLabel("3");
button1.setLabel("button1");
//这是 button1 的监听事件
button1.addMouseListener(new java.awt.event.MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
button1_mousePressed(e);
}
});
popupMenu1.add(menuItem1);
popupMenu1.add(menuItem2);
popupMenu1.add(menuItem3);
this.add(button1, null);
add(popupMenu1);
}
/**Get Applet information*/
public String getAppletInfo()
{
return "Applet Information";
}
/**Get parameter info*/
public String[][] getParameterInfo()
{
return null;
}
void button1_mousePressed(MouseEvent e)
{
/*通过 InputEvent.BUTTON3_MASK 对右键的判断
要判断是左键用 InputEvent.BUTTON1_MASK,
*/
int mods=e.getModifiers();
if((mods&InputEvent.BUTTON3_MASK)!=0)

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 43

{
popupMenu1.show(button1,e.getX(),e.getY());
}
}
}
//applet1.java is over
运行一下,确实可以看到右键弹出了相应的菜单。

我们现在可以打包并发布了.

选择 wizards 菜单的 archive builder,或者通过 new 的 archive builder 来可视化的创建一

个包含这个 applet 的 JAR 文件。

需要注意的几点是,

1.archive type 选 applet,这个选项并不重要,只是相当于通知一下接下来做的是一

个 applet 的 JAR 文件包

2.project class and resources 选 include required class and known resources ,这句

理解为待会儿生成的 JAR 文件包中包含被调用的类文件和需要使用到资源文件。

3.required classes and resources 需添加 test1 的 applet1,新建的 JAR 文件包默认

情况下并不包含所应用到的 applet 的 class 文件,需要在这里进行添加,有多少要用到的

applet,就应该在这里都添加进去

完成后会发现多出来一个 applet 的图标,在 build 后会在其下面多出来一个 test1.jar,在

JAR 的属性栏里是一样可以添加和删除 applet 的 class 文件的,只是记得每次重新编译了 class

文件后都要 rebuild 这个 JAR 文件,这是为了让 JAR 文件中的 class 也得到及时更新。

双击 test1.jar 会发现有两个 class 文件,Applet1.class 和 Applet1$1.class,后者是用来存放鼠

标监听,右键点击事件的中间代码的。

现在只是需要把它发布到浏览器上就可以了。

在 test1 目录下新建 applet1.html 文件,内容很简单:

<APPLET code=test1.Applet1.class archive="test1.jar"></APPLET>

相比之下,要选择发布这样的 class 文件,就必须把 Applet1.class 和 Applet1$1.classl 两

个文件同时放到一个目录下面,两个文件还可以这样照顾的了,但一旦 class 文件数量增多了,

就会难免会出现个别文件丢失的情况,使 applet 的应用产生错误。

打包成 JAR 也使整个 applet 成为一个事务就可以下载过来,因此也减少了网络开销,加快了下

载的速度。由此可见,JAR 文件格式的出现确实让 applet 的应用进入了一个新的可持续发展的

阶段。
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 44

从上一篇看到的 JAR 的基本用法,似乎并没让人有感觉到 JAR 的出现是给 applet 的应用

带来了一个新的开始。但您也许看完了下面的,就会对 JAR 稍有认同了。

很多试着在 jbuilder 里做过 applet 的 java 爱好者都知道,applet 的界面布局是一个比较烦

人的问题,远不是如 VB 里面把控件放到界面上那么简单,就算是用最"高级"的 grid bag 布局

管理器,要在上面摆多个控件也是需要调整又调整的,而且就算是在 jbuilder 里面还看得可以

接受,但换到浏览器里面也许又是另一个样子了,当然也有摆得好的,当毕竟是需要时间和经

验的,可是在 jbuilder 里面如果对底板不选 grid bag 布局管理器,而选 XY 布局,那在上面摆

控 件 就 真 的 是 一 件 很 轻 松 的 事 情 了 , 令 人 遗 憾 的 是 XY 布 局 所 调 用 的 类 是

com.borland.jbcl.layout 下面的,是由 borland 公司自己编写的,很显然这样编写的 applet 是轻

松了编写,痛苦了应用,因为实在是无法让仅仅认得 jdk1.0 的 IE 去认识 borland 写的类,那么

就真的只有写给自己看了吗,现在有了 JAR,你会发现如按下面的步骤来,是可以很轻松的让

别人也看到你写的包含非 jdk 标准类的 applet。

我们在第一步写的那界面上再添加几个按钮,先把底板的布局由 grid bag 改变成 xy,再在

上面添加几个按钮,把按钮的右击事件也设置为弹出菜单,以下是源程序,在 jbuilder 生成的

代码上简化一下,去掉暂可不用的代码和一些注释,但保证可以正常运行,
package test1;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import com.borland.jbcl.layout.*;

public class Applet1 extends Applet


{
boolean isStandalone = false;
PopupMenu popupMenu1 = new PopupMenu();
MenuItem menuItem1 = new MenuItem();
MenuItem menuItem2 = new MenuItem();
MenuItem menuItem3 = new MenuItem();
Button button1 = new Button();
/*面板改变为 XYLayout 布局,使用的是非 jdk 标准类*/
XYLayout xYLayout1 = new XYLayout();
Button button2 = new Button();
Button button3 = new Button();/*添加三个按钮*/
public void init()
{
menuItem1.setLabel("1");
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 45

menuItem2.setLabel("2");
menuItem3.setLabel("3");
button1.setLabel("button1");
button1.addMouseListener(new java.awt.event.MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
button1_mousePressed(e);
}
});
this.setLayout(xYLayout1);
button2.setLabel("button2");
button2.addMouseListener(new java.awt.event.MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
button1_mousePressed(e);
}
});
button3.setLabel("button3");
button3.addMouseListener(new java.awt.event.MouseAdapter()
{
/*三个按钮的右键事件都为一个*/
public void mousePressed(MouseEvent e)
{
button1_mousePressed(e);
}
});
popupMenu1.add(menuItem1);
popupMenu1.add(menuItem2);
popupMenu1.add(menuItem3);
this.add(button1, new XYConstraints(155, 5, -1, -1));
add(popupMenu1);

this.add(button2, new XYConstraints(49, 94, 101, 32));


this.add(button3, new XYConstraints(235, 92, 98, 36));
}
void button1_mousePressed(MouseEvent e)
{
int mods=e.getModifiers();
if((mods&InputEvent.BUTTON3_MASK)!=0)
{
popupMenu1.show(button1,e.getX(),e.getY());
}

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 46

}
}
通过在 jbuilder 的预览中可以看到,三个按钮未改动位置,而且右键单击也按要求在一个

按钮上出现 。很可惜的 是这样的 applet 无法发布出来, 我们试着打 开 class 目录下的

Applet1.html,IE 报出一个出错信息:"load:test1.Applet1 cant't be instantiated"。原因就是 IE

并不认识 com.borland.jbcl.layout 下面的类,而这里使用了 XYLayout。.那么我们开始制作包含

该 XYLayout 类的 JAR 来发布该 applet。

还是通过 new 一个 Archive Builder 开始,

Archive type : Applet

Project classes and resources : Include required classes and known resources

Required classes and resources : add test1.Applet1.class

再点击 next,就到了关键的一步,显示的 JBCL 和 DataExpress 都是 applet 所需要调用到

的类,而且都是非 jdk 标准的,可以通过在这里选择后也包含到这个 JAR 文件中,供 applet 调

用,默认的设定是 Include required classes and all resources,即把 applet 所需要调用的类包

含到 JAR 中,并且还包括这个类所中所包含的所有资源,而不管 applet 是否会用到。所以我们

一般情况下只需要选择 include required classes and known resources,资源文件要尽量少的

包含到 JAR 中,以避免 JAR 文件过于庞大。记住是要让 JBCL 和 DataExpress 都选择为 Include

Deps。这样便很轻松的完成了相关类的添加工作。

完成后可以在 test1.jpr 的目录数下找到 Applet,builder 它得到的 test1.jar 目录数中可以看

到多出了 com.borland.jbcl.layout 这样的目录,在这个目录下包含着 XYLayout.class 和

XYConstraints.class 两个类文件,这就是这个 applet 所需要调用的非标准类了,还是要记住,

每当重新编译了这个 applet,都要再编译一次 JAR,这样才能让新生成的 applet 文件包含到 JAR

中。

接下来就只需要在有 test1.jar 这个文件的目录里面新建一个文件 testjar.html :

<applet code=test1.Applet1.class archive="test1.jar" width=350 height=200 > </applet>

需要提醒的是,如果在 IE 里面浏览该 html,如果有过重新编译 JAR 并要把变化反应到网

页上来,又没有关闭先前开的浏览该 html 的 IE 窗口,就要在地址栏里面按 Ctrl+F5 来刷新该

html。

可以看到这样的应用真的给 applet 赋予了更强大的生命力,而且在 jbuilder 里面很容易的

就实现了它。但是就 applet 的应用来讲,还是有个悬而未决的问题,很多朋友都知道,在 applet

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 47

里面不能添加进 swing 类,因为 IE 只是支持 jdk1.0,而 swing 类是以 jdk1.1 轻型用户界面框

架为基础的,不在 IE 的支持范围,那么自然也不能正常显示,现在问题是也不能用 Jbuilder

的 Archive Builder 来把 applet 所需要调用的 swing 类包含到 JAR 中。

但也不是没有办法,一个较为简单的办法是装 jre(Java Runtime Environment ),但是这

个办法的缺点是要让每一个要浏览该 applet 的机器都要安装 jre。另一个办法是重新复制编译一

次 swing 类,生成自己的类,这样就可以被 JAR 打包时所包含到了,当然这需要的较多的时间

和精力,这里举一个较为简单的例子,如果在 applet 里使用 Jbutton,那么先把 jdk 里面一个

src.jar 这个文件解压,再在目录 javax,swing 下,找到 Jbutton.java 文件,查看它的源码,并

把所有涉及到的 swing 类都复制到一个目录下,改变每一个文件的 package 属性。再编译,通

过了就说明找到的文件全了,没有通过就必须再找到,直到不再编译出错为止。最后从 applet

引用这个已经编译的 class,而不再用 swing。好像这个办法是笨了点,但对大家熟悉 java 是

很有帮助的。

差不多 JAR 的用法可以说掌握到这样就可以了,当然还有更精彩的应用,如与数字签名结

合可以突破以往对 applet 的限制,甚至可以访问本地硬盘,网络等等。如果大家对此感兴趣,

我也会在稍后的文章中对数字签名和 JAR 的结合跟大家作一个较为详尽的探讨。

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 48

Appendix C J2ME 工具介绍


C.1 J2ME_CLDC/KVM 安装
从http://wwws.sun.com/software/communitysource/j2me/cldc/download.html下载
j2me_cldc最新版本,以下以 1.0 版本的 2 个包为例介绍安装步骤:
j2me_cldc-1_0-src-winsol.zip

j2me_cldc-1_0-src-palm_overlay.zip

step 1.解开 j2me_cldc-1_0-src-winsol.zip 包,会产生一个 j2me_cldc 目录,将这个目录复制

到 c:\。

step 2.设置环境变量:

PATH=c:\j2me_cldc\bin;%PATH%

CLASSPATH=%CLASSPATH%;c:\j2me_cldc\bin\api\classes

j2meclasspath=c:\j2me_cldc|bin\api\classes

step 3.解开 j2me_cldc-1_0-src-palm_overlay.zip 包,产生文件夹:

E:\j2me_cldc-1_0-src-palm_overlay

step 4.编译 palm 的 prc 工具:

在 E:\j2me_cldc-1_0-src-palm_overlay \tools\palm\src\palm\database 下:

javac –d c:\j2me_cldc\bin\api\class *.java

step 5.复制 E:\j2me_cldc-1_0-src-palm_overlay \tools\palm\src\palm\database 下的

2 个文件:Wrapper.prc 和 DefaultTiny.bmp 到 c:\j2me_cldc\bin\api\classes\palm

\database 目录下

step 6.安装 kvm 到 palm:

将 c:\j2me_cldc\bin 下的 KVM.prc 和 KVMutil.prc 安装到 palm

j2me_cldc 安装结束.

C.2 安装 KAWT:

KAWT API 是为 KVM 所提供的用户界面处理组件,由德国的 Michael Kroll 和 Stefan

Haustein 共同开发和维护。

从www.kawt.de上下载三个软件包:

kawt_io_net_pdb.zip

kawt_io_net.zip

kawt_pdb.zip

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 49

step 1.安装 kawt_pdb.zip 里的 kawt.pdb 和 kawt_io_net_pdb 里的 kawt_io_net.pdb 到 palm

step 2.将 kawt_io_net.zip 里的 class 文件复制到 c:\j2me_cldc\bin\api\classes 下

KAWT 安装结束.

C.3 如何编译?

以下程序为例:

Example:
import com.sun.kjava.*;
public class HelloWorld extends Spotlet
{
static Graphics g = Graphics.getGraphics();

public HelloWorld()
{
paint();
}

private void paint()


{
g.clearScreen();
g.drawString(“Hello World!”,60,80);
}

public static void main(String[] args)


{
new HelloWorld();
}
}
step 1.编译文件:
javac –g:none –bootclasspath %j2meclasspath HelloWorld.java
step 2.确认 class 文件:
preverfy –d new HelloWorld
#-d new 的目的是把新产生的 class 文件放在 new 文件夹下
step 3. 查看效果:
kvm HelloWorld
step 4. 转成 prc 文件:
java palm.database.MakePalmApp –v –bootclasspath %j2meclasspath%
-classpath new HelloWorld
生成了一个 HelloWorld.prc 的文件,安装到 palm 里看看效果吧。
C.4 工具参数使用说明

z palm.database.MakePalmApp

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 50

功能说明:

将编译好的 class 文件转换成 Palm 格式的 prc 文件,供在 palm 上执行。

语法:

java palm.database.MakePalmApp [参数] [class 文件名]

参数说明:

-verbose

同 javac.exe 的-verbose 参数功能。

-v

同-verbose 参数功能。如果连续使用 2 个,也就是-v –v 的话,则会提供更多的信

息。

-networking

如果所写程序有网络功能,则需要该参数。

-nonetworking

默认值,如果没有网络功能的程序,则不需要该参数。

-classpath

同 javac.exe 的-classpath 参数。如果所用到的类 class 文件是包在 JAR 文件里,

也可以使用这个参数来指定会用到的 JAR 文件。如果同时会用到好几个的话,请

用冒号”:”隔开。

-bootclasspath

同 javac.exe 的-bootclasspath 参数.

-JARtoPRC <jar file>

将 JAR 文件转换成 PRC 文件.

-icon <icon>

指定程序在 palm 上所用到的图标。目前只接受三种格式:Windows 的 bitmap 文

件(.bmp)、Portable 的 bitmap 文件(.pbm)和 Palm 格式的 bitmap 文件(.bin),且

图标的大小为 22*32 象素,如果超过这个尺寸,会强制转换为 22*32 象素。

-listicon <icon>

程序在 list 状态下所使用的图标,大小为 15*9 象素。

-name <name>

为程序在 Palm 上取个文件名称(Application name)。如果没有指定,则默认为第


Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 51

一个输入的类名称。

-longname <name>

为程序取一个较长的名字,例如在做红外传输时所显示的。

-creator <id>

在 Palm 中,每个应用程序会有一个唯一的 Creator ID(可以到 palm 网站上去申

请),如果没有参数,它会自动产生。

-outfile <name>

产生出来的 pdb 文件的文件名。是 PC 上的名称,不是 Palm 上的。

-o <name>

同-outfile.

-version <string>

程序在 Palm 上所要显示的版本名称。

z palm.database.MakePalmDB

功能说明:

这个工具是将 class 文件转换成 Palm 数据库格式 pdb 文件。

语法:

java palm.database.MakePalmDB [参数] [class 文件名]

参数说明:

-v、-verbose

同前面提到过的功能。

-classpath

同前面提到过的功能。

-name <name>

同前。

-longname <name>

同-name 参数,Palm 上的数据库只有一个名字,不象应用程序可以有 2 个不同

的名字。

-creator <id>

指定数据库的 Creator ID.如果数据库是附属于某个应用程序之下的话,这里设定

的 Creator ID 要跟应用程序的 Creator ID 一样。


Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 52

-type <type>

指定数据库的 TypeID.通常使用”DATA”。

-outfile <name>

产生出来 pdb 文件的文件名.是 pc 上的名称,不是 Palm 上的。

-o <name>

同-outfile.

z palm.database.ConvPRCtoJAR

功能说明:

这个工具刚好与前面所提到的 MakePalmApp 相反,是将 prc 文件转换回 JAR 文件

语法:

java palm.database.ConvPRCtoJAR [参数] [class 文件名]

参数说明:

-v、-verbose

同前面提到过的功能。

-classpath

同前面提到过的功能。

-PRCfile <file>

要转换的 prc 文件。

-outfile、-o <name>

同前面提到过的功能。

C.5 中文问题。

在编译时加上 –encoding ISO8859_1 参数就可以在 KVM 下显示中文字。

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 53

Appendix D 写 bean 类的准则


写 bean 的 最 好 方 法 是 遵 循 Sun Microsystems 的 JavaBean 规 范 。 您 可 以 在

www.javasoft.com 上获得更多关于 JavaBean 的信息。

D.1 一般要求

首先,您必须有一个不带有参数的公用构造器。此构造器也应该通过调用各个特性的设置

方法来设置特性的缺省值,例如:

Example:
public Fireworks()
{
setAutoStart(true);
setBackground(Color.black);
setSpeed(10);
setRadius(40);
….
}
如果 bean 是一个从 java.awt.Component 类继承而来的可视 bean,您就应该为 bean

定义一个缺省的首选大小,例如:

Example:
public Dimension getPreferredSize()
{
return (new Dimension(radius*3, radius*3));
}
public Dimension getMinimumSize()
{
return getPreferredSize();
}
D.2 特性

对于您需要的每个特性,您应该有一个带有匹配公用 getter 和 setter 方法的专用实例变

量,例如:

Example:
private int speed;

public int getSpeed()
{
return speed;
}

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 54

public void setSpeed(int s)


{
speed = s;
}
此 get 和 set 方法必须有与实例变量相同的名称,但是第一个字母要大写并以 get 和

set 开头。

由于连接而在任何时候更改它们的特性时,确认 Bean 在运行时行为正确也是很重要的。

如果特性的更改影响到 Bean 的可视外观,您应该以此特性设置的方法来调用

repaint();。

同样,如果特性的更改影响到 bean 的大小和位置,您需要确认获得验证的事物。我们建

议编写您自己的 validateAll 方法,如下所示:

Example:
private void validateAll()
{
if (isValid())
{
Component self = this;
self.invalidate();
Component myParent = self.getParent();
if (myParent != null)
{
myParent.invalidate();
self = myParent;
}
self.validate();
}
}
然后以此特性设置的方法调用

validateAll();。

bean 类将无法进行关于调用特性设置方法命令的假设。您应该写 bean 以便可以初始构

造它,然后在不引起错误的同时在任何命令中设置其特性。

D.3 操作

对于每个您需要的操作,您应该有一个公用方法,例如:

Example:
public void start()
{
if(thread==null)
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 55

{
thread=new Thread(this);
thread.start();
}
}
您为操作写的方法应该在无须期待用户创建连接或设置很多特性的情况下独立操作。 例

如,如果您写了一个音频 Bean,您希望通过播放操作处理打开声音的所有步骤、完成您需要

的所有设置并播放声音。同样,即使声音未播放,停止操作也应起作用。

D.4 事件

对于您需要的每个事件或事件设置,您应该定义事件和侦听器类。对于此例,查看

FireworksEvent.java 源文件以及 Fireworks.java 文件。此事件类的源应该如同这样:

Example:
import java.awt.*;
import java.util.*;
public class FireworksEvent extends EventObject
{
public static final int EXPLODED = 1;
int id = 0;
public FireworksEvent(Component source, int id)
{
super(source);
this.id = id;
}
public int getID()
{
return id;
}
}
您应该为此事件设置中的每个事件定义一个公用静态结束事件标识符,例如在此例子中的

EXPLODED。

对于侦听器类的源,查看 FireworksListener.java 源文件:

Example:
import java.util.*;
public interface FireworksListener extends EventListener
{
public abstract void exploded(FireworksEvent e);
}
您应该为此事件设置中的每个事件定义一个公用抽象方法,例如在此例子中的 exploded。

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 56

而且,侦听器类必须扩展 EventListener ,以使 JAR 向导能够找到它。

然后,如果由 bean 类播送事件,它必须跟踪侦听事件的对象。要这样做,您需要定义侦

听器实例变量以及 addListener 和 removeListener 方法。返回 Fireworks.java 源,例如,您

将查看到:
private Vector listeners = new Vector();
…...
public void addFireworksListener(FireworksListener f)
{
listeners.addElement(f);
}

public void removeFireworksListener(FireworksListener f)


{
listeners.removeElement(f);
}
最后,bean 类需要以正确的次数将事件实际播送到所有的侦听器。要这样做,您需要定

义 processEvent 方法并以适当的次数调用它,例如:

Example:
public void processFireworksEvent(FireworksEvent e)
{
for (Enumeration enum = listeners.elements(); enum.hasMoreElements(); )
((FireworksListener)enum.nextElement()).exploded(e);
}

public void run()


{

processFireworksEvent(new FireworksEvent(this, FireworksEvent.EXPLODED));
}
D.5 提示和窍门

如果您要创建产品级 Bean,请记住先做八件事:

使 bean 越小越好,但要注意当前的浏览器是否支持小 bean

bean 或许导致工具滞后,继而导致浏览器滞后,最终导致 JDK 自身滞后。如果您必须使

用切边的类,或者 bean 的性质要求 bean 较大,则您应该考虑将您的 bean 作为一个插件,

并在一个自包含 jar 中发送它,或者如有可能,使它具有自己的小安装过程。您将失去某些小

bean 的优势:

Web 管理员必须多执行一个步骤:提醒用户在浏览 Web 页面之前必须先下载和安装您的

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 57

jar 或安装程序

网上冲浪者也必须多执行一个步骤:在浏览 Web 页面之前先下载和安装您的 jar 或安装

程序。

使您的 bean 可翻译

将所有的翻译文本,包括名称和 bean 的简短描述及其特征,分隔成 .properties 文件。

JAR 向导会为您做这些。

您需要记住并自己完成的两件事是:特性编辑器和定制器。定制器、对话框特性编辑器或

选择特性编辑器中的所有术语,例如高、中、低,也必须为翻译而分隔。 理想情况下,您也可

以实际翻译 bean 并在 Bean 的 jar 中提供各种语言的 .properties 文件。 然而,如果您至

少提供了本地语言 .properties 文件,则第三方可为您翻译 bean。

在文件清单中为 bean 指定 Depends-On: 标记

将 Bean 的 jar 中的所有文件标识为“运行时需要 vs. 只在编辑时需要”


。在运行时需要

的所有文件将列示在 jar 清单文件的依赖于:标签后。JAR 向导的发布标签使这个操作很简单,

并使您获得清单文件权。

如果您不指定依赖于:标签,工具将假设所有文件都是在运行时需要。这对于下载性能(例

如不必要地下载特性编辑器和其它只在编辑时需要的文件)是很不好的。

赋予您的 bean 一个明确的首选大小

bean 将实现 getPreferredSize 方法,以便当首次用可能未定义的关键字特性构造时,它

的表现良好。 如果在第一次放入时,bean 是 0 x 0 象素,那么用户可能会混淆。 当更改关

键字特性时,首选大小也应正常工作。例如,如果 bean 有一个在垂直和水平方位间转换的特

性,则首选大小应被写入以相应地调整自身。

为 bean 指定缺省特性

利用 JavaBean 规范中的缺省特性部分,它将使您的 bean 在某些工具中易于使用。 JAR

向导使这个操作变得简单并为您获得 BeanInfo 权。

为 bean 及其特性指定简要的非技术名称和简短描述

寻 找 简 要 的 非 技 术 名 来 代 替 冗 长 的 技 术 术 语 。 例 如 , 用 sum interval 代 替

accumulatorInterval。还请注意,特性名的首选项以小写表示并在字与字间留有空格,这对于

用户将更友好。

缩小用户可见的特性范围

为 bean 提供一个明确的 BeanInfo 以便不将每个实例变量都显示为 bean 的特性,而且


Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 58

不将每个方法显示为 Bean 的操作。 JAR 向导使这个操作变得简单并为您获得 BeanInfo

权。

为 bean 指定大图标和小图标

最后,为 Bean 提供大的(32x32)和小的(16x16)彩色图标。而且,确保图标有一个

不同于灰色的透明背景。尽管很少使用,您也应养成提供黑色和白色图标的习惯。JAR 向导的

调色板 标签使这个操作变得简单,并使您获得 BeanInfo .

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 59

Appendix E Javadoc 使用介绍


文章来源: http://outinn.myrice.com/

文章作者:边城狂人

E.1 前言

Java 的语法与 C++ 及为相似,那么,你知道 Java 的注释有几种吗?是两种?

// 注释一行

/* ...... */ 注释若干行

不完全对,除了以上两种之外,还有第三种,文档注释:

/** ...... */ 注释若干行,并写入 javadoc 文档

通常这种注释的多行写法如下:
/**
* .........
* .........
*/
暂停,暂停!这第三种注释有什么用?javadoc 又是什么东西?

好,那就让我告诉你——

E.2 Java 文档和 javadoc

Java 程序员都应该知道使用 JDK 开发,最好的帮助信息就来自 SUN 发布的 Java 文

档。它分包、分类详细的提供了各方法、属性的帮助信息,具有详细的类树信息、索引信息等,

并提供了许多相关类之间的关系,如继承、实现接口、引用等。

Java 文档全是由一些 html 文件组织起来的,在 SUM 的站点上可以下载它们的压缩包。

但是你肯定想不到,这些文档我们可以自己生成。——就此打住,再吊一次胃口。

安装了 JDK 之后,安装目录下有一个 src.jar 文件或者 src.zip 文件,它们都是以 ZIP 格

式压缩的,可以使用 WinZip 解压。解压之后,我们就可以看到分目录放的全是 .java 文件。

是了,这些就是 Java 运行类的源码了,非常完整,连注释都写得一清二楚……不过,怎么看

这些注释都有点似曾相识的感觉?

这就不奇怪了,我们的迷底也快要揭开了。如果你仔细对比一下 .java 源文件中的文档注

释 (/** ... */) 和 Java 文档的内容,你会发现它们就是一样的。Java 文档只是还在格式和排版

上下了些功夫。再仔细一点,你会发现 .java 源文件中的注释还带有 HTML 标识,如 <B>、

<BR>、<Code> 等,在 Java 文档中,该出现这些标识的地方,已经按标识的的定义进行了

排版。
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 60

终于真像大白了,原来 Java 文档是来自这些注释。难怪这些注释叫做文档注释呢!不过,

是什么工具把这些注释变成文档的呢?

是该请出 javadoc 的时候了。在 JDK 的 bin 目录下你可以找到 javadoc,如果是

Windows 下的 JDK,它的文件名为 javadoc.exe。使用 javdoc 编译 .java 源文件时,它会

读出 .java 源文件中的文档注释,并按照一定的规则与 Java 源程序一起进行编译,生成文档。

介绍 javadoc 的编译命令之前,还是先了解一下文档注释的格式吧。不过为了能够编译下

面提到的若干例子,这里先介绍一条 javadoc 命令:

javadoc -d 文档存放目录 -author -version 源文件名.java

这条命令编译一个名为 “源文件名.java”的 java 源文件,并将生成的文档存放在“文档

存放目录”指定的目录下,生成的文档中 index.html 就是文档的首页。-author 和 -version 两

个选项可以省略。

E.3 文档注释的格式

文档注释可以用于对类、属性、方法等进行说明。写文档注释时除了需要使用 /** .... */ 限

定之外,还需要注意注释内部的一些细节问题。

1. 文档和文档注释的格式化

生成的文档是 HTML 格式,而这些 HTML 格式的标识符并不是 javadoc 加的,而

是我们在写注释的时候写上去的。比如,需要换行时,不是敲入一个回车符,而是写入 <br>,

如果要分段,就应该在段前写入 <p>。

因此,格式化文档,就是在文档注释中添加相应的 HTML 标识。

文档注释的正文并不是直接复制到输出文件 (文档的 HTML 文件),而是读取每一行

后,删掉前导的 * 号及 * 号以前的空格,再输入到文档的。如

Example:
/**
* This is first line. <br>
* This is second line. <br>
*This is third line.
*/
编译输出后的 HTML 源码则是

Example:

This is first line. <br>

This is second line. <br>

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 61

This is third line.

前导的 * 号允许连续使用多个,其效果和使用一个 * 号一样,但多个 * 号前不能有

其它字符分隔,否则分隔符及后面的 * 号都将作为文档的内容。* 号在这里是作为左边界

使用,如上例的第一行和第二行;如果没有前导的 * 号,则边界从第一个有效字符开始,

而不包括前面的空格,如上例第三行。

还有一点需要说明,文档注释只说明紧接其后的类、属性或者方法。如下例:

Example:
/** comment for class */
public class Test
{
/** comment for a attribute */
int number;
/** comment for a method */
public void myMethod() { ...... }
......
}
上例中的三处注释就是分别对类、属性和方法的文档注释。它们生成的文档分别是说

明紧接其后的类、属性、方法的。
“紧接”二字尤其重要,如果忽略了这一点,就很可能造

成生成的文档错误。如

Example: 正确的例子
import java.lang.*;

/** commnet for class */


public class Test { ...... }
这个文档注释将生成正确的文档。但只需要改变其中两行的位置,变成下例,就会出

错:

Example: 错误的例子
/** commnet for class */
import java.lang.*;
public class Test { ...... }
这个例子只把上例的 import 语句和文档注释部分交换了位置,结果却大不相同——

生成的文档中根本就找不到上述注释的内容了。原因何在?

“/** commnet for class */”是对 class Test 的说明,把它放在“public class Test

{ ...... }”之前时,其后紧接着 class Test,符合规则,所以生成的文档正确。但是把它和

“import java.lang.*;”调换了位置后,其后紧接的就是不 class Test 了,而是一个 import

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 62

语句。由于文档注释只能说明类、属性和方法,import 语句不在此列,所以这个文档注释

就被当作错误说明省略掉了。

2. 文档注释的三部分

根据在文档中显示的效果,文档注释分为三部分。先举例如下,以便说明。

Example:
/**
* show 方法的简述.
* <p>show 方法的详细说明第一行<br>
* show 方法的详细说明第二行
* @param b true 表示显示,false 表示隐藏
* @return 没有返回值
*/
public void show(boolean b)
{
frame.show(b);
}
第一部分是简述。文档中,对于属性和方法都是先有一个列表,然后才在后面一个一

个的详细的说明。列表中属性名或者方法名后面那段说明就是简述。如下图中被红框框选

的部分:

简述部分写在一段文档注释的最前面,第一个点号 (.) 之前 (包括点号)。换句话说,

就是用第一个点号分隔文档注释,之前是简述,之后是第二部分和第三部分。如上例中的 “*

show 方法的简述.”。

有时,即使正确地以一个点号作为分隔,javadoc 仍然会出错,把点号后面的部分也

做为了第一部分。为了解决这个问题,我们可以使用一个 <p> 标志将第二分部分开为下

一段,如上例的“* <p>show 方法的详细说明第一行 ....”。除此之外,我们也可以使用 <br>

来分隔。

第二部分是详细说明部分。该部分对属性或者方法进行详细的说明,在格式上没有什

么特殊的要求,可以包含若干个点号。它在文档中的位置如下图所示:

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 63

这部分文档在上例中相应的代码是:
* show 方法的简述.
* <p>show 方法的详细说明第一行<br>
* show 方法的详细说明第二行
发现什么了?对了,简述也在其中。这一点要记住了,不要画蛇添足——在详细说明

部分中再写一次简述哦!

第三部分是特殊说明部分。这部分包括版本说明、参数说明、返回值说明等。它在文

档中的位置:

第三部分在上例中相应的代码是
* @param b true 表示显示,false 表示隐藏
* @return 没有返回值
除了 @param 和 @return 之外,还有其它的一些特殊标记,分别用于对类、属性和

方法的说明……不要推我,我马上就说。
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 64

E.4 使用 javadoc 标记

javadoc 标记是插入文档注释中的特殊标记,它们用于标识代码中的特殊引用。javadoc 标

记由“@”及其后所跟的标记类型和专用注释引用组成。记住了,三个部分——@、标记类型、

专用注释引用。不过我宁愿把它分成两部分:@ 和标记类型、专用注释引用。虽然 @ 和 标

记类型之间有时可以用空格符分隔,但是我宁愿始终将它们紧挨着写,以减少出错机会。

javadoc 标记有如下一些:
标 记 用 于 作 用
@author 对类的说明 标明开发该类模块的作者
@version 对类的说明 标明该类模块的版本
@see 对类、属性、方法的说明 参考转向,也就是相关主题
@param 对方法的说明 对方法中某参数的说明
@return 对方法的说明 对方法返回值的说明
@exception 对方法的说明 对方法可能抛出的异常进行说明
下面详细说明各标记。

1. @see 的使用

@see 的句法有三种:
@see 类名
@see #方法名或属性名
@see 类名#方法名或属性名
类名,可以根据需要只写出类名 (如 String) 或者写出类全名 (如 java.lang.String)。

那么什么时候只需要写出类名,什么时候需要写出类全名呢?

如果 java 源文件中的 import 语句包含了的类,可以只写出类名,如果没有包含,则

需要写出类全名。java.lang 也已经默认被包含了。这和 javac 编译 java 源文件时的规

定一样,所以可以简单的用 javac 编译来判断,源程序中 javac 能找到的类,javadoc 也

一定能找到;javac 找不到的类,javadoc 也找不到,这就需要使用类全名了。

方法名或者属性名,如果是属性名,则只需要写出属性名即可;如果是方法名,则需

要写出方法名以及参数类型,没有参数的方法,需要写出一对括号。如
成员类型 成员名称及参数 @see 句法
属性 number @see number
属性 count @see count
方法 count() @see count()
方法 show(boolean b) @see show(boolean)
方法 main(String[] args) @see main(String[])
有时也可以偷懒:假如上例中,没有 count 这一属性,那么参考方法 count() 就可以

简写成 @see count。不过,为了安全起见,还是写全 @see count() 比较好。


Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 65

@see 的第二个句法和第三个句法都是转向方法或者属性的参考,它们有什么区别

呢?

第二个句法中没有指出类名,则默认为当前类。所以它定义的参考,都转向本类中的

属性或者方法。而第三个句法中指出了类名,则还可以转向其它类的属性或者方法。

关于 @see 标记,我们举个例说明。由于 @see 在对类说明、对属性说明、对方法

说明时用法都一样,所以这里只以对类说明为例。

Example:
/**
* @see String
* @see java.lang.StringBuffer
* @see #str
* @see #str()
* @see #main(String[])
* @see Object#toString()
*/
public class TestJavaDoc
{
……
}
生成的文档的相关部分如下图:

String 和 StringBuffer 都是在 java.lang 包中,由于这个包是默认导入了的,所以这

两个类可以直接写类名,也可以写类全名。str、str() 为同名属性和方法,所以方法名需要

用 () 区分。main 是带参数的方法,所以在 () 中指明了参数类型。toString() 虽然在本类

中也有 (从 Object 继承的),但我们是想参考 Object 类的 toString() 方法,所以使用了

Object#toString()。

奇怪的是,为什么其中只有 str、str() 和 main(String[]) 变成了链接呢?那是因为编

译时没有把 java.lang 包或者 Stirng、StringBuffer、Object 三个类的源文件一起加入编

译,所以,生成的文档没有关于那三个类的信息,也就不可以建立链接了。后面讲解 javadoc

编译命令的时候还会详细说明。

上例中如果去把类中的 str 属性去掉,那么生成的文档又会有什么变化呢?你会发现,

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 66

原来是 str, str(),而现在变成了 str(), str(),因为 str 属性已经没有了,所以 str 也

表示方法 str()。

2. 使用 @author、@version 说明类

这两个标记分别用于指明类的作者和版本。缺省情况下 javadoc 将其忽略,但命令行

开关 -author 和 -version 可以修改这个功能,使其包含的信息被输出。这两个标记的句

法如下:
@author 作者名
@version 版本号
其中,@author 可以多次使用,以指明多个作者,生成的文档中每个作者之间使用逗

号 (,) 隔开。@version 也可以使用多次,只有第一次有效,生成的文档中只会显示第一

次使用 @version 指明的版本号。这里特别注意:如果使用了 CVS 控制版本,则可以在

@version 后加上 CVS 版本控制符号: $Id$,这样,每次更新,CVS 会自动在当前处替换

为最新版本号。如下例

Example:
/**
* @author Fancy
* @author Bird
* @version Version 1.00
* @version Version 2.00
*/
public class TestJavaDoc
{
}
生成文档的相关部分如图:

从生成文档的图示中可以看出,两个 @author 语句都被编译,在文档中生成了作者列表。

而两个 @version 语句中只有第一句被编译了,只生成了一个版本号。

从图上看,作者列表是以逗号分隔的,如果我想分行显示怎么办?另外,如果我想显

示两个以上的版本号又该怎么办?

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 67

——我们可以将上述两条 @author 语句合为一句,把两个 @version 语句也合为一句:

Example:
@author Fancy<br>Bird
@version Version 1.00<br>Version 2.00
结果如图:

我们这样做即达到了目的,又没有破坏规则。@author 之后的作者名和 @version 之

后的版本号都可以是用户自己定义的任何 HTML 格式,所以我们可以使用 <br> 标记将

其分行显示。同时,在一个 @version 中指明两个用 <br> 分隔的版本号,也没有破坏只

显示第一个 @version 内容的规则。

3. 使用 @param、@return 和 @exception 说明方法

这三个标记都是只用于方法的。@param 描述方法的参数,@return 描述方法的返回

值,@exception 描述方法可能抛出的异常。它们的句法如下:
@param 参数名 参数说明
@return 返回值说明
@exception 异常类名 说明
每一个 @param 只能描述方法的一个参数,所以,如果方法需要多个参数,就需要

多次使用 @param 来描述。

一个方法中只能用一个 @return,如果文档说明中列了多个 @return,则 javadoc 编

译时会发出警告,且只有第一个 @return 在生成的文档中有效。

方法可能抛出的异常应当用 @exception 描述。由于一个方法可能抛出多个异常,所

以可以有多个 @exception。每个 @exception 后面应有简述的异常类名,说明中应指出

抛出异常的原因。需要注意的是,异常类名应该根据源文件的 import 语句确定是写出类

名还是类全名。 示例如下:

Example:
public class TestJavaDoc
{
/**
* @param n a switch
* @param b excrescent parameter
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 68

* @return true or false


* @return excrescent return
* @exception java.lang.Exception throw when switch is 1
* @exception NullPointerException throw when parameter n is null
*/
public boolean fun(Integer n) throws Exception
{
switch (n.intValue())
{
case 0:
break;
case 1:
throw new Exception("Test Only");
default:
return false;
}
return true;
}
}

使用 javadoc 编译生成的文档相关部分如下图:

可以看到,上例中 @param b excrescent parameter 一句是多余的,因为参数只是一

个 n,并没有一个 b  但是 javadoc 编译时并没有检查。因此,写文档注释时一定要正

确匹配参数表与方法中正式参数表的项目。如果方法参数表中的参数是 a,文档中却给出

对参数 x 的解释,或者再多出一个参数 i,就会让人摸不着头脑了。@exceptin 也是一样。

上例程序中并没有抛出一个 NullPointerException,但是文档注释中为什么要写上这

么一句呢,难道又是为了演示?这不是为了演示描述多余的异常也能通过编译,而是为了
Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 69

说明写异常说明时应考运行时 (RunTime) 异常的可能性。上例程序中,如果参数 n 是给

的一个空值 (null),那么程序会在运行的时候抛出一个 NullPointerException,因此,在文

档注释中添加了对 NullPointerException 的说明。

上例中的 @return 语句有两个,但是根据规则,同一个方法中,只有第一个 @return

有效,其余的会被 javadoc 忽略。所以生成的文档中没有出现第二个 @return 的描述。

讲到这里,该怎么写文档注释你应该已经清楚了,下面就开始讲解 javadoc 的常用命

令。

E.5 javadoc 命令

运行 javadoc -help 可以看到 javadoc 的用法,这里列举常用参数如下:

用法:

javadoc [options] [packagenames] [sourcefiles]

选项:

-public 仅显示 public 类和成员

-protected 显示 protected/public 类和成员 (缺省)

-package 显示 package/protected/public 类和成员

-private 显示所有类和成员

-d <directory> 输出文件的目标目录

-version 包含 @version 段

-author 包含 @author 段

-splitindex 将索引分为每个字母对应一个文件

-windowtitle <text> 文档的浏览器窗口标题

javadoc 编译文档时可以给定包列表,也可以给出源程序文件列表。例如在 CLASSPATH

下有两个包若干类如下:

Example:

fancy.Editor

fancy.Test

fancy.editor.ECommand

fancy.editor.EDocument

fancy.editor.EView

这里有两个包 (fancy 和 fancy.editor) 和 5 个类。那么编译时 (Windows 环境) 可以使


Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net
Java 编码标准及规范手册 70

用如下 javadoc 命令:

javadoc fancy\Test.java fancy\Editor.java fancy\editor\ECommand.java

fancy\editor\EDocument.java fancy\editor\EView.java

这是给出 java 源文件作为编译参数的方法,注意命令中指出的是文件路径,应该根据实

际情况改变。也可以是给出包名作为编译参数,如:

javadoc fancy fancy.editor

用浏览器打开生成文档的 index.html 文件即可发现两种方式编译结果的不同,如下图:

用第二条命令生成的文档被框架分成了三部分:包列表、类列表和类说明。在包列表中选

择了某个包之后,类列表中就会列出该包中的所有类;在类列表中选择了某个类之后,类说明

部分就会显示出该类的详细文档。而用第一条命令生成的文档只有两部分,类列表和类说明,

没有包列表。这就是两种方式生成文档的最大区别了。

下面再来细说选项。

-public、-protected、-package、-private 四个选项,只需要任选其一即可。它们指定的显

示类成员的程度。它们显示的成员多少是一个包含的关系,如下表:

-private (显示所有类和成员)

-package (显示 package/protected/public 类和成员)

-protected (显示 protected/public 类和成员)

-public (仅显示 public 类和成员)

-d 选项允许你定义输出目录。如果不用 -d 定义输出目录,生成的文档文件会放在当前目

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 71

录下。-d 选项的用法是

-d 目录名

目录名为必填项,也就是说,如果你使用了 -d 参数,就一定要为它指定一个目录。这个

目录必须已经存在了,如果还不存在,请在运行 javadoc 之前创建该目录。

-version 和 -author 用于控制生成文档时是否生成 @version 和 @author 指定的内容。

不加这两个参数的情况下,生成的文档中不包含版本和作者信息。

-splitindex 选项将索引分为每个字母对应一个文件。默认情况下,索引文件只有一个,且

该文件中包含所有索引内容。当然生成文档内容不多的时候,这样做非常合适,但是,如果文

档内容非常多的时候,这个索引文件将包含非常多的内容,显得过于庞大。使用 -splitindex 会

把索引文件按各索引项的第一个字母进行分类,每个字母对应一个文件。这样,就减轻了一个

索引文件的负担。

-windowtitle 选项为文档指定一个标题,该标题会显示在窗口的标题栏上。如果不指定该

标题,而默认的文档标题为“生成的文档(无标题)”。该选项的用法是:

-windowtitle 标题

标题是一串没有包含空格的文本,因为空格符是用于分隔各参数的,所以不能包含空格。

同 -d 类似,如果指定了 -windowtitle 选项,则必须指定标题文本。

到此为止,Java 文档和 javadoc 就介绍完了。javadoc 真的能让我们在 Java 注释上做

文章——生成开发文档。

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net


Java 编码标准及规范手册 72

Appendix F Change logs and Todo List


Changes logs

Æ2002/09/07 完成初稿

Todo list

计划增加内容列表:

EJB 参考

Bean 标准规范

Author: Zoof Chow WebSite:www.7ing.net Email:zoof@263.net

You might also like