﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-BeanSoft's Java Blog-随笔分类-Java SE</title><link>http://www.blogjava.net/beansoft/category/17517.html</link><description>MyEclipse 6, Java EE 5, JSPWiki, Spring, Struts, Hibernate, JPA, SWT, Swing, AJAX, JavaScript, Netbeans</description><language>zh-cn</language><lastBuildDate>Mon, 26 May 2008 05:50:55 GMT</lastBuildDate><pubDate>Mon, 26 May 2008 05:50:55 GMT</pubDate><ttl>60</ttl><item><title>Applet安全限制和签名Applet</title><link>http://www.blogjava.net/beansoft/archive/2008/05/11/199801.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Sun, 11 May 2008 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/05/11/199801.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/199801.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2008/05/11/199801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/199801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/199801.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">因为</span><span lang="EN-US">Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">在浏览器中运行，所以，并不是什么操作都能做，例如不能读写创建文件，不能任意连接网站等等，总之就是不可威胁用户电脑的信息安全。下面我们来试试看，新建一个文件操作的</span><span lang="EN-US">Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，代码清单如下：</span></p> <p class="MsoNormal"><b style="mso-bidi-font-weight: normal"><span lang="EN-US">applets.FileOperationApplet<?xml:namespace prefix = o /><o:p></o:p></span></b></p> <table style="border-top-style: none; border-right-style: none; border-left-style: none; border-collapse: collapse; border-bottom-style: none; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0pt 5.4pt 0pt 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"> <tbody> <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"> <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-top: windowtext 1pt solid; padding-bottom: 0pt; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0pt; border-bottom: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt" valign="top" width="568"> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">package</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> applets;</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p>&nbsp;</o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">import</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> java.applet.Applet;</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">import</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> java.awt.Label;</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">import</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> java.io.*;</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p>&nbsp;</o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">public</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> </span><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">class</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> FileOperationApplet </span><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">extends</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> Applet {</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span></span><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">public</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> </span><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">void</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> start() {</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">try</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> {</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FileWriter out = </span><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">new</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> FileWriter(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">"c:\\test.txt"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">);</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>out.write(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">"</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">测试写入文件</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">);</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>out.close();</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>add(</span><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">new</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> Label(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">"</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">文件写入成功</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">));</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </span><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">catch</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> (IOException e) {</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">// </span><b><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">TODO</span></b><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> Auto-generated catch block</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>e.printStackTrace();</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>add(</span><b><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">new</span></b><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"> Label(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">"</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">文件写入失败</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">));</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; mso-layout-grid-align: none" class="MsoNormal" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>}</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt" lang="EN-US">}</span></p></td></tr></tbody></table> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">。首先我们用</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">来运行，当然没问题，因为模拟器为了调试方便，是运行所有的操作的，运行后，界面显示文件写入成功，并且在</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">盘根目录下可以找到文件</span><span lang="EN-US">test.txt</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，并看到文件内容。随后我们创建</span><span lang="EN-US">HTML</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">文件，打算在网页文件中运行它，文件代码清单如下：</span></p> <p class="MsoNormal"><b style="mso-bidi-font-weight: normal"><span lang="EN-US">FileOperationApplet.html<o:p></o:p></span></b></p> <table style="border-top-style: none; border-right-style: none; border-left-style: none; border-collapse: collapse; border-bottom-style: none; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0pt 5.4pt 0pt 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"> <tbody> <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"> <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-top: windowtext 1pt solid; padding-bottom: 0pt; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0pt; border-bottom: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt" valign="top" width="568"> <p class="MsoNormal"><span lang="EN-US">&lt;html&gt;</span></p> <p class="MsoNormal"><span lang="EN-US">&lt;body&gt;</span></p> <p class="MsoNormal"><span lang="EN-US">&lt;applet code=applets.FileOperationApplet.class width="200" height="200" &gt;</span></p> <p class="MsoNormal"><span lang="EN-US">&lt;/applet&gt;</span></p> <p class="MsoNormal"><span lang="EN-US">&lt;/body&gt;</span></p> <p class="MsoNormal"><span lang="EN-US">&lt;/html&gt;</span></p></td></tr></tbody></table> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，接着用浏览器打开这个网页，可以看到如图</span><span lang="EN-US">18.6</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">所示的出错界面和信息提示。这个出错信息完整的内容是：</span></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US">java.security.AccessControlException: access denied (java.io.FilePermission c:\test.txt write)<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>at java.security.AccessControlContext.checkPermission(Unknown Source)<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>at java.security.AccessController.checkPermission(Unknown Source)<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>at java.lang.SecurityManager.checkPermission(Unknown Source)<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>at java.lang.SecurityManager.checkWrite(Unknown Source)<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>at java.io.FileOutputStream.&lt;init&gt;(Unknown Source)<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>at java.io.FileOutputStream.&lt;init&gt;(Unknown Source)<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>at java.io.FileWriter.&lt;init&gt;(Unknown Source)<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>at applets.FileOperationApplet.start(FileOperationApplet.java:10)<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>at java.lang.Thread.run(Unknown Source)<o:p></o:p></span></i></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，即：访问拒绝，不能写入文件</span><span lang="EN-US">c:\test.txt</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">。这很安全，不是吗？</span></p> <p style="text-align: center" class="MsoNormal" align="center"><span lang="EN-US"><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/AppletApplet_9712/clip_image002_2.jpg"><img border="0" alt="clip_image002" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/AppletApplet_9712/clip_image002_thumb.jpg" width="295" height="147" v:shapes="_x0000_i1025"></a></span></p> <p style="text-align: center" class="MsoNormal" align="center"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">图</span><span lang="EN-US">18.6 Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">安全限制错误</span></p> <p style="text-align: center" class="MsoNormal" align="center"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">然而实话实说，</span><span lang="EN-US">Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">在企业内部网上，还是很有用处的，它一般可以用来做一些复杂的操作，或者是大文件的上传下载，即时消息支持等等，笔者见过不少这样的解决方案（网络上也有人制作了</span><span lang="EN-US">Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">批量文件上传的功能）。不过，这样的限制，虽然是安全了，但是却让</span><span lang="EN-US">Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">的功能大打折扣，那么有没有办法绕过这层安全限制呢？答案是肯定的，这就是</span><span lang="EN-US">Java</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">中推出的签名</span><span lang="EN-US">JAR</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">功能，可以帮助我们在用户同意的情况下，绕过安全限制（当然在内部网没有问题，如果是外网，很容易发生恶意代码，例如恶意删除文件等等）。</span></p> <p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><b style="mso-bidi-font-weight: normal"><span style="color: red; font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">注意：</span></b><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">由于</span><span lang="EN-US">Microsoft</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">也推出了一款</span><span lang="EN-US">JVM</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，导致了</span><span lang="EN-US">Java</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">标准的分裂，微软格式的数字签名</span><span lang="EN-US">applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">打包格式为</span><span lang="EN-US">cab</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，签名方式也和我们下面描述的内容不同，有兴趣的读者可以去查找相关资料，总之是不通用的。</span></p> <p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">如果是正规的公司，数字证书都是需要购买的，像</span><span lang="EN-US">Verisign</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">之类的公司，提供这样的服务，它的好处就是确保证书是全球唯一的，能够在出现事故时，鉴定是否是有效的数字证书，其实就类似于一份全球唯一的身份证，带有你自己才知道的密码，缺点就是不免费。大家如果在线安装过软件，一般大公司的插件，例如</span><span lang="EN-US">Flash</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">播放器等等，都会带有数字证书。当然，在</span><span lang="EN-US">Java</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">中，不需要这么麻烦，</span><span lang="EN-US">JDK</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">已经提供了一个工具</span><i style="mso-bidi-font-style: normal"><span lang="EN-US">keytool.exe</span></i><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">来让开发人员自己生成数字证书（至于安全，加密方面的话题，那就太繁杂了，读者可以自己去查找资料）。如果不想使用命令行版本的这个工具，还可以下载一个开源的软件</span><span lang="EN-US">KeyTool GUI</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，详见参考资料一节的内容。下面我们就快速进入主题，首先启动</span><span lang="EN-US">CMD</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">命令行工具，然后进入到当前的项目目录，运行下面的命令：</span></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US">keytool -genkey -dname "cn=BeanSoft Studio, ou=Java Software, o=BeanSoft Studio, c=China" -alias beansoft -keypass beansoft -storepass beansoft -validity 365 -keystore .\beansoft<o:p></o:p></span></i></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">这段命令将会创建一个数字文件放在当前目录的二进制文件</span><span lang="EN-US">beansoft</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">中。该证书的别名是</span><span lang="EN-US">beansoft</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">（通过</span><span lang="EN-US">-alias</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">指定），密钥的密码是</span><span lang="EN-US">beansoft</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">（</span><span lang="EN-US">-keypass</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">命令指定），存储密钥的文件密码也是</span><span lang="EN-US">beansoft</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">（</span><span lang="EN-US">- storepass</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">命令指定），证书的有效期是</span><span lang="EN-US">365</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">天（通过</span><span lang="EN-US">-validity</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">指定），</span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">并把它存储到密码文件</span><span lang="EN-US"> beansoft</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">中。这段命令执行后，没有出错信息的话即是创建成功。另外，如果是实际的项目的话，最好将两个密码设置成安全级别比较高的密码。除了这样来生成一个密钥文件外，还可以用</span><span lang="EN-US">KeyTool</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">以交互的方式来生成（比较推荐初学者使用这种方式）：</span></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US">keytool –genkey<o:p></o:p></span></i></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">随后，会提示您输入必须或者可选的内容。</span></p> <p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">随后我们可以检查下这份证书文件的内容，执行下面的命令：</span></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US">keytool -list -keystore .\beansoft -storepass beansoft<o:p></o:p></span></i></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">会输出信息：</span></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US">Keystore </span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">类型：</span><span lang="EN-US"> JKS<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US">Keystore </span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">提供者：</span><span lang="EN-US"> SUN<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">您的</span><span lang="EN-US"> keystore </span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">包含</span><span lang="EN-US"> 1 </span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">输入</span><span lang="EN-US"><o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US">beansoft, 2008-5-7, PrivateKeyEntry,<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">认证指纹</span><span lang="EN-US"> (MD5)</span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">：</span><span lang="EN-US"> 16:15:A0:47:92:96:29:96:93:5D:F0:76:F7:D0:2C:84<o:p></o:p></span></i></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">。这说明证书没有问题。</span></p> <p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">有时可能需要导出证书供人使用，可以执行下面的命令：</span></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US">keytool -export -keystore .\beansoft -storepass beansoft -file beansoft.cer -alias beansoft<o:p></o:p></span></i></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">随后会生成一个</span><span lang="EN-US">beansoft.cer</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，不过在这里对</span><span lang="EN-US">Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">签名是不需要这样做的，只有在做</span><span lang="EN-US">SSL</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">开发时，才能用得到它。</span></p> <p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">随后，请读者按照</span><span lang="EN-US">16.1.3.1 JAR </span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">文件一节所介绍的内容，将</span><span lang="EN-US">Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">的类文件打包成</span><span lang="EN-US">jar</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">文件，名为</span><span lang="EN-US">applets.jar</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，放在项目的根目录下。接着就进入最关键的，对</span><span lang="EN-US">JAR</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">文件进行签名了，键入下列命令：</span></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US">jarsigner -verbose -keystore .\beansoft applets.jar beansoft<o:p></o:p></span></i></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">接着提示信息为：</span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">输入密钥库的口令短语：</span><span lang="EN-US">beansoft</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">按下回车，即可看到签名过程：</span></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">正在添加：</span><span lang="EN-US"> META-INF/MANIFEST.MF<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">正在添加：</span><span lang="EN-US"> META-INF/BEANSOFT.SF<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">正在添加：</span><span lang="EN-US"> META-INF/BEANSOFT.DSA<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">正在添加：</span><span lang="EN-US"> applets/<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp; </span></span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">正在签名：</span><span lang="EN-US"> applets/FileOperationApplet.class<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp; </span></span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">正在签名：</span><span lang="EN-US"> applets/LifeCycleApplet.class<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp; </span></span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">正在签名：</span><span lang="EN-US"> applets/MyApplet.class<o:p></o:p></span></i></p> <p class="MsoNormal"><i style="mso-bidi-font-style: normal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp; </span></span></i><i style="mso-bidi-font-style: normal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">正在签名：</span><span lang="EN-US"> applets/usb.jpg<o:p></o:p></span></i></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">可以看到</span><span lang="EN-US">META-INF</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">目录下将会多出两个数字指纹文件，运行的时候</span><span lang="EN-US">JVM</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">将会和类文件进行对比，确保文件没被人篡改过。</span></p> <p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">好了，现在的</span><span lang="EN-US">applets.jar</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">已经今非昔比了，它是个被签名过的</span><span lang="EN-US">JAR</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，怎么使用它呢？需要在它所在的同一目录下，即项目根目录下，新建一个</span><span lang="EN-US">HTML</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">文件，代码清单如下：</span></p> <p class="MsoNormal"><b style="mso-bidi-font-weight: normal"><span lang="EN-US">FileOperationAppletSigned.html<o:p></o:p></span></b></p> <table style="border-top-style: none; border-right-style: none; border-left-style: none; border-collapse: collapse; border-bottom-style: none; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0pt 5.4pt 0pt 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"> <tbody> <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"> <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-top: windowtext 1pt solid; padding-bottom: 0pt; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0pt; border-bottom: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt" valign="top" width="568"> <p class="MsoNormal"><span lang="EN-US">&lt;html&gt;</span></p> <p class="MsoNormal"><span lang="EN-US">&lt;body&gt;</span></p> <p class="MsoNormal"><span lang="EN-US">&lt;applet code=applets.FileOperationApplet.class <b style="mso-bidi-font-weight: normal"><i style="mso-bidi-font-style: normal">archive="applets.jar"</i></b> width="200" height="200" &gt;</span></p> <p class="MsoNormal"><span lang="EN-US">&lt;/applet&gt;</span></p> <p class="MsoNormal"><span lang="EN-US">&lt;/body&gt;</span></p> <p class="MsoNormal"><span lang="EN-US">&lt;/html&gt;<b style="mso-bidi-font-weight: normal"><o:p></o:p></b></span></p></td></tr></tbody></table> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">唯一的不同，就是多了粗斜体的</span><span lang="EN-US">archive="applets.jar"</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">这句话。</span></p> <p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">好了，最激动人心的时刻到来了，请用浏览器打开这个网页，会看到一个安全提示，如图</span><span lang="EN-US">18.7</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">所示。点击<b style="mso-bidi-font-weight: normal">运行</b>按钮，即可看到正确的执行了操作，在用户的</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">盘上创建了一个文件！很好，我们可以为所欲为了，像写普通</span><span lang="EN-US">Java</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">应用那样来写</span><span lang="EN-US">Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">了！如果点击<b style="mso-bidi-font-weight: normal">取消</b>按钮，那很自然的无法创建文件，用户拥有选择权，当然，如果是企业的客户，自然都是让他们选择运行按钮。其实通过这里读者也可以注意到，现在好多网站（例如视频分享的网站等），都会提示您下载一些插件提供增强的功能，然而，他们的数字证书和这里的一样，都是自己造的（其实就是<b style="mso-bidi-font-weight: normal"><span style="color: red">伪造</span></b>），所以，装完后并不能保证是否夹杂了病毒或者恶意代码，所以读者上网时千万要谨慎识别，不要随意点击在线安装或者运行软件。</span></p> <p style="text-align: center" class="MsoNormal" align="center"><span lang="EN-US"><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/AppletApplet_9712/clip_image004_2.jpg"><img border="0" alt="clip_image004" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/AppletApplet_9712/clip_image004_thumb.jpg" width="295" height="197" v:shapes="_x0000_i1026"></a></span></p> <p style="text-align: center" class="MsoNormal" align="center"><span lang="EN-US">18.7 Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">数字签名安全提示</span></p> <p style="text-align: center" class="MsoNormal" align="center"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>OK</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，罗罗嗦嗦的讲了这么老半天，就是希望给那些使用</span><span lang="EN-US">Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">的用户提供一个相对完整的实践方案，也许现在能在项目中用到</span><span lang="EN-US">AWT</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">，</span><span lang="EN-US">Swing</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">的地方，也就剩下</span><span lang="EN-US">Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">了。接下来讨论在网页中使用</span><span lang="EN-US">Applet</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">的进一步功能：参数传递和调用</span><span lang="EN-US">JavaScript</span><span style="font-family: 宋体; mso-ascii-font-family: arial; mso-hansi-font-family: arial">。</span></p><img src ="http://www.blogjava.net/beansoft/aggbug/199801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-05-11 10:44 <a href="http://www.blogjava.net/beansoft/archive/2008/05/11/199801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thinking In Java 第3版 中文 PDF下载</title><link>http://www.blogjava.net/beansoft/archive/2008/04/29/197413.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Tue, 29 Apr 2008 15:20:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/04/29/197413.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/197413.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2008/04/29/197413.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/197413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/197413.html</trackback:ping><description><![CDATA[下载地址：<a href="http://downloads0517.cncode.com/book/JSP/ThinkingInJava3.rar"><strike>http://downloads0517.cncode.com/book/JSP/ThinkingInJava3.rar</strike></a> 文件大小 3.82 MB <br />此地址经测试已不可用,请从置顶的FTP电子书目录下下载.<br /><br /><p><img height="668" alt="Thinking In Java 第3版 中文 PDF" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/ThinkingInJava3PDF_1481C/Thinking%20In%20Java%20%E7%AC%AC3%E7%89%88%20%E4%B8%AD%E6%96%87%20PDF_3.png" width="561" border="0" /></p><img src ="http://www.blogjava.net/beansoft/aggbug/197413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-04-29 23:20 <a href="http://www.blogjava.net/beansoft/archive/2008/04/29/197413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怀念一下Applet时代：足球，俄罗斯方块</title><link>http://www.blogjava.net/beansoft/archive/2008/03/12/185659.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Wed, 12 Mar 2008 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/03/12/185659.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/185659.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2008/03/12/185659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/185659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/185659.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2008/03/12/185659.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/185659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-03-12 13:04 <a href="http://www.blogjava.net/beansoft/archive/2008/03/12/185659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可以运行 RCP/Swing 的迷你JRE 6（3.75MB）</title><link>http://www.blogjava.net/beansoft/archive/2008/01/18/176353.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Fri, 18 Jan 2008 14:35:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/01/18/176353.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/176353.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2008/01/18/176353.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/176353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/176353.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2008/01/18/176353.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/176353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-01-18 22:35 <a href="http://www.blogjava.net/beansoft/archive/2008/01/18/176353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java SE 6 Update N Early Access 提供下载</title><link>http://www.blogjava.net/beansoft/archive/2007/12/02/164696.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Sun, 02 Dec 2007 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/12/02/164696.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/164696.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/12/02/164696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/164696.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/164696.html</trackback:ping><description><![CDATA[<p>以前一直宣传的 消费版 JRE, 号称仅有 2MB 大小, 现在提供下载了. 消息来自于 java.sun.com.</p> <p>Get Early Access to the Next Java SE 6 Update<br>Download Java SE 6 Update N, formerly known as the Consumer JRE, and provide feedback on these exciting features: Direct3D, Java Quick Starter, Nimbus, and Deployment Toolkit. Get the RSS feed.</p> <p><a title="https://jdk6.dev.java.net/6uNea.html" href="https://jdk6.dev.java.net/6uNea.html">https://jdk6.dev.java.net/6uNea.html</a></p> <table id="main" cellspacing="0" cellpadding="4" width="100%" border="0"> <tbody> <tr> <td id="midcol"> <div id="bodycol">Subscribe our live link feed for lastest news &amp; information: <img alt="feed-icon-14x14" src="https://jdk6.dev.java.net/feed-icon-14x14.png"><a href="http://blogs.sun.com/SDNProgramNews/feed/entries/atom?cat=%2FJava+SE+6+Update+N">Java SE 6 Update N Early Access</a>  <p style="margin-bottom: 0in">You will find in here an overview of the features covered by Java SE 6 Update N, links to provide feedback and report issues, as well as testing instructions to help you evaluate the new features. </p> <table cellspacing="10" cellpadding="2" align="center"> <tbody> <tr> <td> <p><a href="https://jdk6.dev.java.net/#Overview">Overview</a></p></td> <td> <p><a href="https://jdk6.dev.java.net/#Download">Download</a></p></td> <td> <p><a href="https://jdk6.dev.java.net/testing.html">Testing Guidelines</a></p></td> <td> <p><a href="https://jdk6.dev.java.net/#Feedback">Feedback</a></p></td> <td> <p><a href="https://jdk6.dev.java.net/6uNfaq.html">FAQ</a></p></td></tr></tbody></table><br> <h3><a name="Overview"></a>Overview</h3> <p>Java SE 6 Update N (formerly know as the "Consumer JRE" project) is an update release that introduces new features and enhancements aimed at providing an optimized consumer end user experience. Java SE 6 Update N focuses on the following areas: </p> <ul> <li>Enhanced JRE installation experience  <ul> <li>The <b>Deployment Toolkit</b> takes the guess work out of determining what versions of the JRE end users have installed on their PC. It supplies Java based web applet/application deployers with a simple interface to accomplish Java detection and installation.  <li>The <b>Kernel</b> installation mode (not available yet in this build) lets first time Java users run applets and Web Start applications without waiting for the whole JRE download. While the default Kernel installation will work with existing Java applets, application developers have the ability to select libraries that should be installed with the kernel, before the rest of the JRE is installed on the end user's system.  <li>For current users of Java SE, the <b>JRE update mechanism</b> has also been improved, using a patch-in-place mechanism that translates in a faster and more reliable update process (the patch in place mechanism will take effect for end users who upgrade from this update release or later to a new update release). As an added benefit, follow-on update releases will no longer be listed as separate items in the Windows "Add or Remove Programs" dialog. </li></ul><br> <li>Improved performance and look &amp; feel  <ul> <li>The <b>Quick Starter</b> feature will prefetch portions of the JRE into memory, substantially decreasing the average JRE cold start-up time (the time that it takes to launch a Java application for the first time after a fresh reboot of a PC).  <li><b>Hardware acceleration support</b>: Java SE 6 Update N introduces a fully hardware accelerated graphics pipeline based on the Microsoft Direct3D 9 API, translating into improved rendering of Swing applications which rely on translucency, gradients, arbitrary transformations, and other more advanced 2D operations.  <li>A new cross-platform Swing look &amp; feel, code name <b>Nimbus</b>, provides a nice update over 'Metal' and 'Ocean'. </li></ul><br> <li>Kernel installation mode<br>The <b>Kernel installation mode</b> will be available at a later date. Stay tuned or subscribe our live link feed for lastest news &amp; information: <img alt="feed-icon-14x14" src="https://jdk6.dev.java.net/feed-icon-14x14.png"><a href="http://blogs.sun.com/SDNProgramNews/feed/entries/atom?cat=%2FJava+SE+6+Update+N">Java SE 6 Update N Early Access</a> </li></ul> <p>We are excited to introduce these long needed changes to the JRE, and hope that you will be able to evaluate Java SE 6 Update N and provide <a href="https://jdk6.dev.java.net/#Feedback">feedback</a> to us. </p> <p><b>Note</b> The following articles and presentations provide additional details about the Java SE 6 Update N features: </p> <ul> <li><a href="http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-3160&amp;yr=2007&amp;track=2">Desktop Java Technology Today: JavaOne technical session - May 2007</a>  <li><a href="http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-3290&amp;yr=2007&amp;track=2">Easy Deployment Is Finally Here: JavaOne technical session - May 2007</a>  <li><a href="http://weblogs.java.net/blog/enicholas/archive/2007/05/announcing_the.html">Announcing the Consumer JRE (again!): Ethan Nicholas's blog - 5/17/07</a>  <li><a href="http://weblogs.java.net/blog/chet/archive/2007/05/consumer_jre_le.html">Consumer JRE, Leaner, Meaner Java: Chet Haase's blog - 5/18/07</a>  <li><a href="http://weblogs.java.net/blog/enicholas/archive/2007/05/java_kernel_unm.html">Java Kernel Unmasked: Ethan Nicholas's blog - 5/24/07</a> </li></ul> <h3><a name="Download"></a>Download</h3> <p><b>Note: Please remove any previous installs of 6uN before installing different builds.</b></p> <p><a href="http://javadl.sun.com/webapps/download/GetFile/1.6.0_10-ea-b07/windows-i586/jre-6u10-ea-windows-i586-p-iftw.exe"><img alt="Download button" src="https://jdk6.dev.java.net/Download110x35.png"></a> <a name="Testing"><a href="http://javadl.sun.com/webapps/download/GetFile/1.6.0_10-ea-b07/windows-i586/jre-6u10-ea-windows-i586-p-iftw.exe">Java SE 6 Runtime (JRE) Update N build 07 Windows Online Installer</a> </p> <p><a href="http://www.java.net/download/jdk6/6u10/promoted/b07/binaries/jre-6u10-ea-bin-b07-windows-i586-p-09_nov_2007.exe"><img alt="Download button" src="https://jdk6.dev.java.net/Download110x35.png"></a> <a name="Testing"><a href="http://www.java.net/download/jdk6/6u10/promoted/b07/binaries/jre-6u10-ea-bin-b07-windows-i586-p-09_nov_2007.exe">Java SE 6 Runtime (JRE) Update N build 07 Windows Offline Installer</a> </p> <p>For other platforms, please see <a href="http://download.java.net/jdk6/">Download Page</a></p> <p>See also: <a href="https://jdk6.dev.java.net/6uNfaq.html#Installation">Installation FAQ</a></p> <h3>Testing Guidelines</h3> <p>We recommend you follow the <a href="https://jdk6.dev.java.net/testing.html">testing instructions and guidelines</a> in this section if you are not familiar with any of the new features in Java SE 6 Update N. </p> <h3><a name="Feedback"></a>Feedback</h3> <p>You can ask questions and provide us feedbacks on <a href="http://forums.java.net/jive/index.jspa">Java.net forums</a>. </p> <ul> <li>For Deployment Toolkit, Java Kernel, and Java Update (patch-in-place): <a href="http://forums.java.net/jive/forum.jspa?forumID=79">JRE Installer &amp; Auto Update Forum</a>  <li>For Java QuickStarter: <a href="http://forums.java.net/jive/forum.jspa?forumID=120">Java Quick Starter Forum</a>  <li>For Nimbus: <a href="http://forums.java.net/jive/forum.jspa?forumID=74">Swing &amp; AWT Forum</a>  <li>For Direct3D: <a href="http://forums.java.net/jive/forum.jspa?forumID=69">Java2D Forum</a>  <li>For general issues: <a href="http://forums.java.net/jive/forum.jspa?forumID=119">6uN Early Access</a> </li></ul> <h3><a name="FAQ"></a>FAQ</h3> <p>Visit our <a href="https://jdk6.dev.java.net/6uNfaq.html">FAQ</a> sections for more information. More FAQ will be added as the EA program goes on. </p></div></td></tr></tbody></table><img src ="http://www.blogjava.net/beansoft/aggbug/164696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-12-02 20:37 <a href="http://www.blogjava.net/beansoft/archive/2007/12/02/164696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: JDK 6 中文文档下载地址(ZIP,HTML,CHM)</title><link>http://www.blogjava.net/beansoft/archive/2007/10/14/152693.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Sun, 14 Oct 2007 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/10/14/152693.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/152693.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/10/14/152693.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/152693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/152693.html</trackback:ping><description><![CDATA[<p>目前在 http://developers.sun.com.cn 已正式宣布发布Java SE 6 API 中文版。<br>大家也可以从以下网址下载:<br>* HTML 格式 ( <a href="http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html/zh_CN/api/index.html">http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html/zh_CN/api/index.html</a> &nbsp;)<br>* zip 格式 ( <a href="http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html_zh_CN.zip">http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html_zh_CN.zip</a> &nbsp;)<br>* CHM 格式 ( <a href="http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/chm/JDK_API_1_6_zh_CN.CHM">http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/chm/JDK_API_1_6_zh_CN.CHM</a> &nbsp;) <p><a title="http://gceclub.sun.com.cn/NASApp/sme/jive/thread.jsp?forum=35&amp;thread=44422" href="http://gceclub.sun.com.cn/NASApp/sme/jive/thread.jsp?forum=35&amp;thread=44422">http://gceclub.sun.com.cn/NASApp/sme/jive/thread.jsp?forum=35&amp;thread=44422</a></p><img src ="http://www.blogjava.net/beansoft/aggbug/152693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-10-14 11:01 <a href="http://www.blogjava.net/beansoft/archive/2007/10/14/152693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BeanSoft MySQL Java 开发套装(服务器,管理工具,JDBC驱动,示例代码) 无中文问题</title><link>http://www.blogjava.net/beansoft/archive/2007/10/01/150075.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Mon, 01 Oct 2007 10:13:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/10/01/150075.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/150075.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/10/01/150075.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/150075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/150075.html</trackback:ping><description><![CDATA[<p>BeanSoft MySQL Java 开发套装(服务器,管理工具,JDBC驱动,示例代码)</p> <p>小更新: 为了减轻负担, 用 MySQL-Front 2.5 来管理, 这个软件无中文问题. 如果以后开源版本HeidiSQL的解决了中文问题, 就用开源的.</p> <p>下载: <a href="http://gro.clinux.org/frs/download.php/2103/portable_mysql.exe"><a href="http://gro.clinux.org/frs/download.php/2105/portable_mysql.exe"> <dd><a href="http://gro.clinux.org/frs/download.php/2106/portable_mysql.exe">portable_mysql.exe</a></dd></a></a>&nbsp;&nbsp;4.02MB (自解压包)</p> <p>参考文档: <a href="http://www.blogjava.net/beansoft/archive/2007/02/05/97940.html">MySQL 5 绿色版(BAT版本)</a><br>2007-10-01<br>版权所有 2007 刘长炯(BeanSoft@126.com)<br>Blog: <a href="http://www.blogjava.net/beansoft/">http://www.blogjava.net/beansoft/</a><br>本软件套装采用的协议: GPL, 参考 gpl.txt<br>Java 初学者最头疼的, 莫过于安装数据库, 寻找数据库管理工具, 寻找 JDBC 驱动, 然后编写代码来测试, 然后遇到了乱码问题, 头大的要命, 不知道如何解决. </p> <p>在此, 我搜集了几个开源软件, 组合到一起, 来方便大家的数据库开发. 数据库我选择 MySQL 5.0.41 绿色版(本站开发), 管理工具我选择 MySQL-Front 2.5 免费软件(这个版本可以争取显示中文), 然后选择了 MySQL JDBC 驱动, 并编写了测试代码,&nbsp; 这些代码解决了中文问题, 最后使用免费的 PStart 2.11 制作了启动工具.  <p>用法: 下载后解压缩到硬盘的任意位置, 然后双击 PStart.exe 开始, 先启动 MySQL 服务器, 然后即可编译运行 JDBC 测试代码.  <p>注意事项: 这个版本的 MySQL 绿色版默认采用的字符集是 GBK, 如果你修改成了别的字符集, MySQLFront 将显示为乱码.  <p>感谢以下软件:  <p>MySQL <a href="http://www.mysql.com/">http://www.mysql.com/</a> GPL 协议<br>MySQL Front 2.5 <a href="http://www.mysqlfront.de/">http://www.mysqlfront.de/</a> FreeWare<br>MySQL 绿色版 <a href="http://www.blogjava.net/beansoft/">http://www.blogjava.net/beansoft/</a> GPL 协议<br>MySQL ConnectorJ(即 JDBC 驱动) <a href="http://dev.mysql.com/downloads/connector/j/">http://dev.mysql.com/downloads/connector/j/</a> GPL 协议<br>MySQL JDBC 示例代码 <a href="http://www.blogjava.net/beansoft/">http://www.blogjava.net/beansoft/</a> GPL 协议<br>PStart <a href="http://www.pegtop.net/start/">http://www.pegtop.net/start/</a> FreeWare  <p>截图:  <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="429" alt="image" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/BeanSoftMySQLJavaJDBC_FE38/image_1.png" width="526" border="0">  <p>主界面, 双击 mysql_start 启动 MySQL 服务器  <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="444" alt="image" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/BeanSoftMySQLJavaJDBC_FE38/image_3.png" width="602" border="0">  <p>内置开源 MySQL 管理工具, 双击主界面的 "MySQL-Front" 启动  <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="514" alt="portable_mysql_jdbc" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/BeanSoftMySQLJavaJDBC_FE38/portable_mysql_jdbc_1.png" width="569" border="0">&nbsp;  <p>双击主界面 "运行JDBC" 进行插入和读取数据测试, 开箱即用, 无需配置.  <img src ="http://www.blogjava.net/beansoft/aggbug/150075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-10-01 18:13 <a href="http://www.blogjava.net/beansoft/archive/2007/10/01/150075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BeanDebugger.java 方便的列出 bean 对象的所有属性和值</title><link>http://www.blogjava.net/beansoft/archive/2007/09/22/147340.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Sat, 22 Sep 2007 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/09/22/147340.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/147340.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/09/22/147340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/147340.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/147340.html</trackback:ping><description><![CDATA[<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">package beansoft;


import java.beans.PropertyDescriptor;
import java.util.Vector;

<span style="color: #008000">/**</span>
<span style="color: #008000"> * Debugger at runtime, internal used by BeanSoft.</span>
<span style="color: #008000"> */</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> BeanDebugger {
    <span style="color: #008000">/**</span>
<span style="color: #008000">     * 调试, 打印出给定 Bean 的所有属性的取值.</span>
<span style="color: #008000">     * @date 2005-07-31</span>
<span style="color: #008000">     * @author BeanSoft</span>
<span style="color: #008000">     * @param bean 需要调试的对象</span>
<span style="color: #008000">     */</span>
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> dump(Object bean) {
        java.beans.PropertyDescriptor[] descriptors =
            getAvailablePropertyDescriptors(bean);

        <span style="color: #0000ff">for</span>(<span style="color: #0000ff">int</span> i = 0; descriptors != <span style="color: #0000ff">null</span> &amp;&amp; i &lt; descriptors.length; i++) {
            java.lang.reflect.Method readMethod = descriptors[i].getReadMethod();

            <span style="color: #0000ff">try</span> {
                Object <span style="color: #0000ff">value</span> = readMethod.invoke(bean, <span style="color: #0000ff">null</span>);
                System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"["</span> + bean.getClass().getName() + <span style="color: #006080">"]."</span> +
                        descriptors[i].getName() + <span style="color: #006080">"("</span> + 
                        descriptors[i].getPropertyType().getName() + <span style="color: #006080">") = "</span>
                        + <span style="color: #0000ff">value</span>);
            } <span style="color: #0000ff">catch</span> (Exception e) {
                <span style="color: #008000">// TODO auto generated try-catch</span>
                e.printStackTrace();
            }
        }
    }

 <span style="color: #008000">/**</span>
<span style="color: #008000">  * 从 bean 中读取有效的属性描述符.</span>
<span style="color: #008000">  *</span>
<span style="color: #008000">  * NOTE: 名称为 class 的 PropertyDescriptor 被排除在外.</span>
<span style="color: #008000">  *</span>
<span style="color: #008000">  * @param bean</span>
<span style="color: #008000">  *            Object - 需要读取的 Bean</span>
<span style="color: #008000">  * @return PropertyDescriptor[] - 属性列表</span>
<span style="color: #008000">  */</span>
 <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> java.beans.PropertyDescriptor[] getAvailablePropertyDescriptors(
   Object bean) {
  <span style="color: #0000ff">try</span> {
   <span style="color: #008000">// 从 Bean 中解析属性信息并查找相关的 write 方法</span>
   java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean
     .getClass());
   <span style="color: #0000ff">if</span> (info != <span style="color: #0000ff">null</span>) {
    java.beans.PropertyDescriptor pd[] = info
      .getPropertyDescriptors();
    Vector columns = <span style="color: #0000ff">new</span> Vector();

    <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i &lt; pd.length; i++) {
     String fieldName = pd[i].getName();

     <span style="color: #0000ff">if</span> (fieldName != <span style="color: #0000ff">null</span> &amp;&amp; !fieldName.equals(<span style="color: #006080">"class"</span>)) {
      columns.add(pd[i]);
     }
    }

    java.beans.PropertyDescriptor[] arrays = <span style="color: #0000ff">new</span> java.beans.PropertyDescriptor[columns
      .size()];

    <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> j = 0; j &lt; columns.size(); j++) {
     arrays[j] = (PropertyDescriptor) columns.get(j);
    }

    <span style="color: #0000ff">return</span> arrays;
   }
  } <span style="color: #0000ff">catch</span> (Exception ex) {
   System.<span style="color: #0000ff">out</span>.println(ex);
   <span style="color: #0000ff">return</span> <span style="color: #0000ff">null</span>;
  }
  <span style="color: #0000ff">return</span> <span style="color: #0000ff">null</span>;
 }

}

</pre></div>
<p>&nbsp;</p>
<p>因为开发过程中总是要调用一些 JavaBean 对象, 然后通过数据库操作来给这些对象赋值, 原来调试的时候是通过实现 toString() 方法, 后来发现过于麻烦, 干脆用反射机制直接写了一个工具类来自动打印出来 bean 的所有属性的名称, 类型以及当前的值, 比较方便一些.</p>
<p>&nbsp;</p>
<p>用法: BeanDebugger.dump(myBean);</p>
<p>&nbsp;</p>
<p>一个输出示例:</p>
<p>[technote.query.bean.Category].cat_desc(java.lang.String) = Cables<br>[technote.query.bean.Category].cat_id(int) = 19<br>[technote.query.bean.Category].family_desc(java.lang.String) = Accessories and Cables<br>[technote.query.bean.Category].family_id(int) = 1<br>[technote.query.bean.Category].group_id(int) = 100<br>[technote.query.bean.Category].subcat_desc(java.lang.String) = Accessory<br>[technote.query.bean.Category].subcat_id(int) = 147</p><img src ="http://www.blogjava.net/beansoft/aggbug/147340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-09-22 11:30 <a href="http://www.blogjava.net/beansoft/archive/2007/09/22/147340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSmooth 0.9.9-7 汉化版 发布(图文) 地址已修正</title><link>http://www.blogjava.net/beansoft/archive/2007/09/16/145454.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Sat, 15 Sep 2007 22:20:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/09/16/145454.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/145454.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/09/16/145454.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/145454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/145454.html</trackback:ping><description><![CDATA[<p>JSmooth 是开源的 Java EXE 启动文件生成程序, 可以制作 Windows, DOS 和 服务包装器.&nbsp; 官方网站: <a title="http://jsmooth.sourceforge.net/" href="http://jsmooth.sourceforge.net/">http://jsmooth.sourceforge.net/</a></p>下载: <a title="http://download.gro.clinux.org/beansoft/JSmooth_0.9.9-7_zh_CN.zip" href="http://download.gro.clinux.org/beansoft/JSmooth_0.9.9-7_zh_CN.zip">http://download.gro.clinux.org/beansoft/JSmooth_0.9.9-7_zh_CN.zip</a>&nbsp;3.70 MB<br>下载后解压缩并运行 jsmoothgen.exe即可.  <p><br>截屏: <br><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JSmooth0.9.97_58EA/jsmooth_0.9.9-7_zh_CN.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="618" alt="jsmooth_0.9.9-7_zh_CN" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JSmooth0.9.97_58EA/jsmooth_0.9.9-7_zh_CN_thumb.png" width="702" border="0"></a>&nbsp;</p> <p><br>&nbsp;</p> <h3>JSmooth 版本 0.9.9-7 Build 20070520-256 </h3> <h4>感谢您使用 JSmooth! </h4> <p>中文版翻译: 刘长炯 BeanSoft@126.com 请访问 <a href="http://www.blogjava.net/beansoft/">http://www.blogjava.net/beansoft/</a>来获取一些 JSmooth 中文信息  <p>JSmooth 项目采用 GNU General Public License 发布. 请阅读发行包里的 License.txt. 其它 JSmooth 所捆绑的软件也许会采用他们自己的许可, 请自行检查.  <p>生成的可执行文件(JSmooth 创建的启动器)采用和 gcc 许可例外相似的 LGPL 和 "运行时例外": 你不需要发布源代码, 也不需要你发表声明来提到 jsmooth.  <ul> <li>最新的 JSmooth 新闻, 请访问 <a href="http://jsmooth.sourceforge.net/">官方网站</a>  <li>你可以获取这个版本的特定信息, 位于文件 <a href="Readme.txt">Readme.txt</a> 或者 <a href="Changelog.txt">Changelog</a>.  <li>文档以 <a href="docs/jsmooth-doc.html">HTML</a> 和 <a href="docs/jsmooth-doc.pdf">PDF</a> 格式提供.  <li>请检查 <a href="LICENSE.txt">许可</a>. 你可以参考 <a href="GPL-LICENSE.txt">GPL 许可</a> (JSmooth 采用) 或者 <a href="LGPL-LICENSE.txt">LGPL 许可</a> (可执行文件的源码).  <li>一些包装器提供了 <a href="docs/jniapi/index.html">JSmooth JNI API</a> 来从你的 Java 程序里访问 Windows 特有的功能. </li></ul> <h4>JSmooth 支持 </h4> <p>请提交你发行的任何 bug (臭虫) 到 <a href="http://sourceforge.net/tracker/?group_id=86730">jsmooth 跟踪</a>. 如果你有任何问题, 请使用 <a href="http://sourceforge.net/forum/?group_id=86730">论坛</a> (sourceforge 提供的主机).</p> <p>更多截图:</p> <p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JSmooth0.9.97_58EA/jsmooth_0.9.9-7_zh_CN_1.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="618" alt="jsmooth_0.9.9-7_zh_CN_1" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JSmooth0.9.97_58EA/jsmooth_0.9.9-7_zh_CN_1_thumb.png" width="702" border="0"></a> </p> <p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JSmooth0.9.97_58EA/jsmooth_0.9.9-7_zh_CN_2.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="618" alt="jsmooth_0.9.9-7_zh_CN_2" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JSmooth0.9.97_58EA/jsmooth_0.9.9-7_zh_CN_2_thumb.png" width="702" border="0"></a> </p> <p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JSmooth0.9.97_58EA/jsmooth_0.9.9-7_zh_CN_3.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="618" alt="jsmooth_0.9.9-7_zh_CN_3" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JSmooth0.9.97_58EA/jsmooth_0.9.9-7_zh_CN_3_thumb.png" width="702" border="0"></a> </p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="618" alt="jsmooth_0.9.9-7_zh_CN_4" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JSmooth0.9.97_58EA/jsmooth_0.9.9-7_zh_CN_4_1.png" width="702" border="0"> </p> <p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JSmooth0.9.97_58EA/jsmooth_0.9.9-7_zh_CN_5.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="618" alt="jsmooth_0.9.9-7_zh_CN_5" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JSmooth0.9.97_58EA/jsmooth_0.9.9-7_zh_CN_5_thumb.png" width="702" border="0"></a></p><img src ="http://www.blogjava.net/beansoft/aggbug/145454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-09-16 06:20 <a href="http://www.blogjava.net/beansoft/archive/2007/09/16/145454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样将数字金额转换成中外大写金额（java实现）(转)</title><link>http://www.blogjava.net/beansoft/archive/2007/09/12/144575.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Wed, 12 Sep 2007 10:14:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/09/12/144575.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/144575.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/09/12/144575.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/144575.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/144575.html</trackback:ping><description><![CDATA[<p>方案1:</p> <p><a href="http://topic.csdn.net/t/20020916/19/1028553.html">http://topic.csdn.net/t/20020916/19/1028553.html</a> <p>public&nbsp;&nbsp; static&nbsp;&nbsp; String&nbsp;&nbsp; numtochinese(String&nbsp;&nbsp; input){&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; s1="零壹贰叁肆伍陆柒捌玖";&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; s4="分角整元拾佰仟万拾佰仟亿拾佰仟";&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; temp="";&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; result="";&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; (input==null)&nbsp;&nbsp; return&nbsp;&nbsp; "输入字串不是数字串只能包括以下字符（'0'～'9'，'.')，输入字串最大只能精确到仟亿，小数点只能两位！";&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp=input.trim();&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float&nbsp;&nbsp; f;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f=Float.parseFloat(temp);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception&nbsp;&nbsp; e){return&nbsp;&nbsp; "输入字串不是数字串只能包括以下字符（'0'～'9'，'.')，输入字串最大只能精确到仟亿，小数点只能两位！";}&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; len=0;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; (temp.indexOf(".")==-1)&nbsp;&nbsp; len=temp.length();&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp; len=temp.indexOf(".");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(len&gt;s4.length()-3)&nbsp;&nbsp; return("输入字串最大只能精确到仟亿，小数点只能两位！");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; n1,n2=0;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; num="";&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; unit="";&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int&nbsp;&nbsp; i=0;i&lt;temp.length();i++){&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i&gt;len+2){break;}&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i==len)&nbsp;&nbsp; {continue;}&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n1=Integer.parseInt(String.valueOf(temp.charAt(i)));&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num=s1.substring(n1,n1+1);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n1=len-i+2;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unit=s4.substring(n1,n1+1);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result=result.concat(num).concat(unit);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; ((len==temp.length())||(len==temp.length()-1))&nbsp;&nbsp; result=result.concat("整");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; (len==temp.length()-2)&nbsp;&nbsp; result=result.concat("零分");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; result;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; } <p>&nbsp;</p> <p>&nbsp;</p> <p>方案2(长的方案):</p> <p>来源: <a href="http://topic.csdn.net/t/20060301/11/4585281.html">http://topic.csdn.net/t/20060301/11/4585281.html</a><br>当前看到的方法:之所以写这个方法,因为看到的方法设计的不是很好,通常的做法就是逐个字符处理,通过冗长的switch...case结构判断,来决定当前是否应该输出某某汉字,总体来说,完成这件任务是简单的,但是代码和设计质量却不令人满意. <br>&nbsp; 设计方法如下:&nbsp;&nbsp; <br>&nbsp; 需要注意的问题:&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.各个阿拉伯数字可以通过一个数组'壹','贰','叁'....表示.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.对于大于10000和大于100000000的数字,可能出现'万','亿'字样&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.对于中间连续为0的数字,正确出现'零'的字样,但是有几种不同的情况需要处理&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.对于某个段的数字全零的情况,例如,整个万段都是0的情况-100000101,中间的0如何出现&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.角分的处理,如果不存在角分的话,应该出现'圆整'的字样&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.整数部分不存在的情况,即只有角分,应该没有'圆'的字样&nbsp;&nbsp; <br>&nbsp; 设计框架:&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.把数字转化成字符串处理,使用Java的时候,把一个double类型转化成一个字符串类型很简单,&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String.valueOf(double_var)即可得到,但是有一个问题,当你的数字大于10个位的时候,&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也就是达亿的时候,他会转换成科学计数法的字串,解决方法就是把他转化成整形long.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.把数字分割成整数部分和小数部分分别处理,根据上面的方法,我们索性把double乘上100,&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取后两位为小数部分,前面的为整数部分,得到&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long&nbsp;&nbsp; l&nbsp;&nbsp; =&nbsp;&nbsp; (long)(d*100);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; strVal&nbsp;&nbsp; =&nbsp;&nbsp; String.valueOf(l);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; head&nbsp;&nbsp; =&nbsp;&nbsp; strVal.substring(0,strVal.length()-2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //整数部分&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; end&nbsp;&nbsp; =&nbsp;&nbsp; strVal.substring(strVal.length()-2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //小数部分&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.我们应该把钱数分成段,每四个一段,实际上得到的是一个二维数组,如下:&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仟&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 佰&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 拾&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;'&nbsp;&nbsp; '&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $1&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 万&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>$5&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 亿&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $9&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中$i表示这个数字的第i个位置的数字,我们并不实际设定二维数组,我们得到的是数字的位置,&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要处理的该产生什么样的表示法,很简单这种处理方式往往就是:设pos表示数字位置,pos/4&nbsp;&nbsp; 在那一个段&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 万以下段,万段,亿段.pos%4表示某一个段的段内位置,仟,佰,拾,由于叠加的缘故,即会有千万,百万,千亿等&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 出现,因此这种设计是成立的.这里面隐含了一个问题就是,我们当前的处理的最大数字达千亿位,&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更大的数字用这种结构是不妥的,因为可能会有万亿,这时候推荐的想法是把这些设计成单维的数组结构,&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从而取得叠加的表示.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.循环处理各个位的过程中,我们可以预想到,零的问题是最难解决的.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为我们多个连续的零你只能出现一个表示,更有甚者,当某段全为0时,'零'还不能出现.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此这些问题综合考虑得到以下代码.&nbsp;&nbsp; <br>&nbsp; 代码:(JAVA描述)&nbsp;&nbsp; <br>&nbsp; public&nbsp;&nbsp; static&nbsp;&nbsp; String&nbsp;&nbsp; changeToBig(double&nbsp;&nbsp; value){&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char[]&nbsp;&nbsp; hunit={'拾','佰','仟'};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //段内位置表示&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char[]&nbsp;&nbsp; vunit={'万','亿'};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //段名表示&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char[]&nbsp;&nbsp; digit={'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};&nbsp;&nbsp;&nbsp;&nbsp; //数字表示&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long&nbsp;&nbsp; midVal&nbsp;&nbsp; =&nbsp;&nbsp; (long)(value*100);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //转化成整形&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; valStr=String.valueOf(midVal);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //转化成字符串&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; head=valStr.substring(0,valStr.length()-2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取整数部分&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; rail=valStr.substring(valStr.length()-2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取小数部分&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; prefix="";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>//整数部分转化的结果&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; suffix="";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>//小数部分转化的结果&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //处理小数点后面的数&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rail.equals("00")){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>//如果小数部分为0&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; suffix="整";&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; else{&nbsp;&nbsp; <br>suffix=digit[rail.charAt(0)-'0']+"角"+digit[rail.charAt(1)-'0']+"分";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; //否则把角分转化出来&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //处理小数点前面的数&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char[]&nbsp;&nbsp; chDig=head.toCharArray();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>//把整数部分转化成字符数组&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp; zero='0';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //标志'0'表示出现过0&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte&nbsp;&nbsp; zeroSerNum&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //连续出现0的次数&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int&nbsp;&nbsp; i=0;i&lt;chDig.length;i++){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //循环处理每个数字&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; idx=(chDig.length-i-1)%4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取段内位置&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; vidx=(chDig.length-i-1)/4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取段位置&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(chDig[i]=='0'){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果当前字符是0&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zeroSerNum++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //连续0次数递增&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(zero&nbsp;&nbsp; ==&nbsp;&nbsp; '0'){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //标志&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zero=digit[0];&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; else&nbsp;&nbsp; if(idx==0&nbsp;&nbsp; &amp;&amp;&nbsp;&nbsp; vidx&nbsp;&nbsp; &gt;0&nbsp;&nbsp; &amp;&amp;zeroSerNum&nbsp;&nbsp; &lt;&nbsp;&nbsp; 4){ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prefix&nbsp;&nbsp; +=&nbsp;&nbsp; vunit[vidx-1];&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zero='0';&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zeroSerNum&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //连续0次数清零&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(zero&nbsp;&nbsp; !=&nbsp;&nbsp; '0')&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果标志不为0,则加上,例如万,亿什么的&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prefix+=zero;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zero='0';&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prefix+=digit[chDig[i]-'0'];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //转化该数字表示&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(idx&nbsp;&nbsp; &gt;&nbsp;&nbsp; 0)&nbsp;&nbsp; prefix&nbsp;&nbsp; +=&nbsp;&nbsp; hunit[idx-1];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(idx==0&nbsp;&nbsp; &amp;&amp;&nbsp;&nbsp; vidx&gt;0){&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prefix+=vunit[vidx-1];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //段结束位置应该加上段名如万,亿&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(prefix.length()&nbsp;&nbsp; &gt;&nbsp;&nbsp; 0)&nbsp;&nbsp; prefix&nbsp;&nbsp; +=&nbsp;&nbsp; '圆';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果整数部分存在,则有圆的字样&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; prefix+suffix;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回正确表示&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; </p><img src ="http://www.blogjava.net/beansoft/aggbug/144575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-09-12 18:14 <a href="http://www.blogjava.net/beansoft/archive/2007/09/12/144575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Java堆和栈的区别</title><link>http://www.blogjava.net/beansoft/archive/2007/09/08/143551.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Sat, 08 Sep 2007 00:34:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/09/08/143551.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/143551.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/09/08/143551.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/143551.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/143551.html</trackback:ping><description><![CDATA[<p>栈与堆都是Java用来在Ram中存放数据的地方。与C++不同，Java自动管理栈和堆，程序员不能直接地设置栈或堆。 <br>Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立，它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的，堆的优势是可以动态地分配内存大小，生存期也不必事先告诉编译器，因为它是在运行时动态分配内存的，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动态分配内存，存取速度较慢。 <br>栈的优势是，存取速度比堆要快，仅次于寄存器，栈数据可以共享。但缺点是，存在栈中的数据大小与生存期必须是确定的，缺乏灵活性。栈中主要存放一些基本类型的变量（,int, short, long, byte, float, double, boolean, char）和对象句柄。 <br>栈有一个很重要的特殊性，就是存在栈中的数据可以共享。假设我们同时定义： <br>int a = 3; <br>int b = 3； <br>编译器先处理int a = 3；首先它会在栈中创建一个变量为a的引用，然后查找栈中是否有3这个值，如果没找到，就将3存放进来，然后将a指向3。接着处理int b = 3；在创建完b的引用变量后，因为在栈中已经有3这个值，便将b直接指向3。这样，就出现了a与b同时均指向3的情况。 <br>这时，如果再令a=4；那么编译器会重新搜索栈中是否有4值，如果没有，则将4存放进来，并令a指向4；如果已经有了，则直接将a指向这个地址。因此a值的改变不会影响到b的值。 <br>要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的，因为这种情况a的修改并不会影响到b, 它是由编译器完成的，它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态，会影响到另一个对象引用变量。 <br>String是一个特殊的包装类数据。可以用： <br>String str = new String("abc"); <br>String str = "abc"; <br>两种的形式来创建，第一种是用new()来新建对象的，它会在存放于堆中。每调用一次就会创建一个新的对象。 <br>而第二种是先在栈中创建一个对String类的对象引用变量str，然后查找栈中有没有存放"abc"，如果没有，则将"abc"存放进栈，并令str指向”abc”，如果已经有”abc” 则直接令str指向“abc”。 <br>比较类里面的数值是否相等时，用equals()方法；当测试两个包装类的引用是否指向同一个对象时，用==，下面用例子说明上面的理论。 <br>String str1 = "abc"; <br>String str2 = "abc"; <br>System.out.println(str1==str2); //true <br>可以看出str1和str2是指向同一个对象的。 <br>String str1 =new String ("abc"); <br>String str2 =new String ("abc"); <br>System.out.println(str1==str2); // false <br>用new的方式是生成不同的对象。每一次生成一个。 <br>因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度，因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc")；的代码，则一概在堆中创建新对象，而不管其字符串值是否相等，是否有必要创建新对象，从而加重了程序的负担。 <br>另一方面, 要注意: 我们在使用诸如String str = "abc"；的格式定义类时，总是想当然地认为，创建了String类的对象str。担心陷阱！对象可能并没有被创建！而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。 <br>由于String类的immutable性质，当String变量需要经常变换其值时，应该考虑使用StringBuffer类，以提高程序效率。</p><img src ="http://www.blogjava.net/beansoft/aggbug/143551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-09-08 08:34 <a href="http://www.blogjava.net/beansoft/archive/2007/09/08/143551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC 入门视频: 配置 SQL Explorer 插件, ODBC 数据源, 建表, 用 JDBC 读取数据库</title><link>http://www.blogjava.net/beansoft/archive/2007/08/29/140937.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Wed, 29 Aug 2007 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/08/29/140937.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/140937.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/08/29/140937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/140937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/140937.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 仅供第一次接触Java的初学者参考.&nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2007/08/29/140937.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/140937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-08-29 15:38 <a href="http://www.blogjava.net/beansoft/archive/2007/08/29/140937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 入门视频: 下载, 运行, 第一个 HelloWorld</title><link>http://www.blogjava.net/beansoft/archive/2007/08/27/140023.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Mon, 27 Aug 2007 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/08/27/140023.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/140023.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/08/27/140023.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/140023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/140023.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 供第一次接触 Eclipse 开发的朋友参考.&nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2007/08/27/140023.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/140023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-08-27 16:43 <a href="http://www.blogjava.net/beansoft/archive/2007/08/27/140023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 入门视频: 下载, 安装 JDK, 配置环境变量, HelloWorld</title><link>http://www.blogjava.net/beansoft/archive/2007/08/27/139901.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Mon, 27 Aug 2007 06:09:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/08/27/139901.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/139901.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/08/27/139901.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/139901.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/139901.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 供第一次接触Java的朋友参考.&nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2007/08/27/139901.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/139901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-08-27 14:09 <a href="http://www.blogjava.net/beansoft/archive/2007/08/27/139901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐给初学者的 Java 视频</title><link>http://www.blogjava.net/beansoft/archive/2007/08/27/139836.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Mon, 27 Aug 2007 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/08/27/139836.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/139836.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/08/27/139836.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/139836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/139836.html</trackback:ping><description><![CDATA[<p>1. 程序员之家--Java视频下载 <a href="http://www.sunxin.org/video/java.asp">http://www.sunxin.org/video/java.asp</a><br><br>2. 尚学堂 Java 视频下载 <a href="http://www.bjsxt.com/download.html">http://www.bjsxt.com/download.html</a><br></p>
<p>3.《尚学堂科技.马士兵.JAVA.JSP.系列视频教程-2007-03-01更新》(java video courses) | 资料 &#8594; 计算机教程 | VeryCD &#8594; 下载 需要电驴 <a href="http://lib.verycd.com/2006/11/16/0000128251.html">http://lib.verycd.com/2006/11/16/0000128251.html</a></p>
<p><br>实在还有问题, 建议 Google, 或者 <a href="http://www.chinajavaworld.com/">www.chinajavaworld.com</a>, javaeye.com 等等, 一定能找到答案. 学习怎么自主解决问题也是一种基本功.</p>
<img src ="http://www.blogjava.net/beansoft/aggbug/139836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-08-27 11:40 <a href="http://www.blogjava.net/beansoft/archive/2007/08/27/139836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SCJP 模拟考试题, 笔试常考</title><link>http://www.blogjava.net/beansoft/archive/2007/08/24/138978.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Fri, 24 Aug 2007 00:21:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/08/24/138978.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/138978.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/08/24/138978.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/138978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/138978.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2007/08/24/138978.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/138978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-08-24 08:21 <a href="http://www.blogjava.net/beansoft/archive/2007/08/24/138978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何打包程序为 JAR 文件</title><link>http://www.blogjava.net/beansoft/archive/2007/05/24/119568.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Thu, 24 May 2007 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/05/24/119568.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/119568.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/05/24/119568.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/119568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/119568.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文解决了两个问题:1. 如何用 jar 命令或者 winzip/winrar 打包 JAR; 2. 讨论一下打包到单独 JAR 文件的应用程序的编写需要注意的问题.&nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2007/05/24/119568.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/119568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-05-24 09:55 <a href="http://www.blogjava.net/beansoft/archive/2007/05/24/119568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java学习从入门到精通[原创] [精華] (ZZ)</title><link>http://www.blogjava.net/beansoft/archive/2007/05/11/116729.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Fri, 11 May 2007 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/05/11/116729.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/116729.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/05/11/116729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/116729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/116729.html</trackback:ping><description><![CDATA[<span class=javascript id=text14954>
<p><a href="http://www.javaworld.com.tw/jute/post/view?bid=29&amp;id=14954&amp;sty=1&amp;tpg=1&amp;age=0">http://www.javaworld.com.tw/jute/post/view?bid=29&amp;id=14954&amp;sty=1&amp;tpg=1&amp;age=0</a><br></p>
<p>作者：robbin <br>网址：<a class=ilink href="http://www.fankai.com/" target=_blank><u><font color=#004080>http://www.fankai.com/</font></u></a> <br><br><strong>Java Learning Path （一）、工具篇</strong> <br><br><strong>一、 JDK (Java Development Kit)</strong> <br><br>JDK是整个Java的核心，包括了Java运行环境（Java Runtime Envirnment），一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK，除了Sun之外，还有很多公司和组织都开发了自己的JDK，例如IBM公司开发的JDK，BEA公司的Jrocket，还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM（Java Virtual Machine）运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说，我们还是需要先把Sun JDK掌握好。 <br><br><strong>1、 JDK的下载和安装</strong> <br>JDK又叫做J2SE（Java2 SDK Standard Edition），可以从Sun的Java网站上下载到，http://java.sun.com/j2se/downloads.html ，JDK当前最新的版本是J2SDK1.4.2，建议下载该版本的JDK，下载页面在这里：http://java.sun.com/j2se/1.4.2/download.html。 <br><br>下载好的JDK是一个可执行安装程序，默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE（供浏览器来使用），在C:\j2sdk1.4.2下安装一套JDK（也包括一套JRE）。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。 <br><br><strong>2、 JDK的命令工具</strong> <br>JDK的最重要命令行工具： <br>java： 启动JVM执行class <br>javac： Java编译器 <br>jar： Java打包工具 <br>javadoc： Java文档生成器 <br>这些命令行必须要非常非常熟悉，对于每个参数都要很精通才行。对于这些命令的学习，JDK Documentation上有详细的文档。 <br><br><strong>二、 JDK Documentation</strong> <br><br>Documentation在JDK的下载页面也有下载连接，建议同时下载Documentation。Documentation是最最重要的编程手册，涵盖了整个Java所有方面的内容的描述。可以这样说，学习Java编程，大部分时间都是花在看这个Documentation上面的。我是随身携带的，写Java代码的时候，随时查看，须臾不离手。 <br><br><strong>三、 应用服务器(App Server)</strong> <br><br>App Server是运行Java企业组件的平台，构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss，选择其中一个进行学习就可以了，个人推荐Weblogic，因为它的体系结构更加干净，开发和部署更加方便，是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server： <br><br><strong>1、 Tomcat</strong> <br>Tomcat严格意义上并不是一个真正的App Server，它只是一个可以支持运行Serlvet/JSP的Web容器，不过Tomcat也扩展了一些App Server的功能，如JNDI，数据库连接池，用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中，因此本文做一点下载、安装和配置Tomcat的介绍： <br><br>Tomcat是Apache组织下Jakarta项目下的一个子项目，它的主网站是：<a class=ilink href="http://jakarta.apache.org/tomcat/" target=_blank><u><font color=#0000ff>http://jakarta.apache.org/tomcat/</font></u></a> ，Tomcat最新版本是Tomcat4.1.27，软件下载的连接是：<a class=ilink href="http://www.apache.org/dist/jakarta/tomcat-4/binaries/" target=_blank><u><font color=#0000ff>http://www.apache.org/dist/jakarta/tomcat-4/binaries/</font></u></a> 。 <br><br>下载Tomcat既可以直接下载zip包，也可以下载exe安装包（个人建议zip更干净些），不管哪种情况，下载完毕安装好以后（zip直接解压缩就可以了）。需要设置两个环境变量： <br><br>JAVA_HOME=C:\j2sdk1.4.2 <br>CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录<img alt=Wink src="http://www.javaworld.com.tw/jute/images/smiles/smile_wink.gif" width=15> <br><br>这样就安装好了，启动Tomcat运行CATALINA_HOME\bin\startup.bat，关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后，默认使用8080端口，因此可以用浏览器访问http://localhost:8080来测试Tomcat是否正常启动。 <br><br>Tomcat提供了两个Web界面的管理工具，URL分别是： <br><a class=ilink href="http://localhost:8080/admin/index.jsp" target=_blank><u><font color=#0000ff>http://localhost:8080/admin/index.jsp</font></u></a> <br><a class=ilink href="http://localhost:8080/manager/html" target=_blank><u><font color=#0000ff>http://localhost:8080/manager/html</font></u></a> <br>在启用这两个管理工具之前，先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件，加入如下几行： <br><br>&lt;role rolename="manager"/&gt; <br>&lt;role rolename="admin"/&gt; <br>&lt;user username="robbin" password="12345678" roles="admin,manager,tomcat"/&gt; <br><br>这样用户&#8220;robbin&#8221;就具备了超级管理员权限。重新启动Tomcat以后，你就可以使用该用户来登陆如上的两个管理工具，通过Web方式进行Tomcat的配置和管理了。 <br><br><strong>2、 BEA Weblogic</strong> <br>Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版，License可以免费使用1年时间，其实这已经完全足够了。Weblogic的下载连接：<a class=ilink href="http://commerce.bea.com/index.jsp" target=_blank><u><font color=#0000ff>http://commerce.bea.com/index.jsp</font></u></a>，Weblogic的在线文档：<a class=ilink href="http://edocs.bea.com/" target=_blank><u><font color=#0000ff>http://edocs.bea.com/</font></u></a> 。 <br><br><strong>3、 IBM Webshpere</strong> <br>Websphere同样可以下载到免费的试用版本，到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料，developerWorks中文网站的连接是：<a class=ilink href="http://www-900.ibm.com/developerWorks/cn/wsdd/" target=_blank><u><font color=#0000ff>http://www-900.ibm.com/developerWorks/cn/wsdd/</font></u></a> ，Websphere的下载连接：<a class=ilink href="http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html" target=_blank><u><font color=#0000ff>http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html</font></u></a> 。 <br><br><strong>4、 Jboss</strong> <br>Jboss是免费开源的App Server，可以免费的从Jboss网站下载：<a class=ilink href="http://www.jboss.org/index.html" target=_blank><u><font color=#0000ff>http://www.jboss.org/index.html</font></u></a>，然而Jboss的文档是不免费，需要花钱购买，所以为我们学习Jboss设置了一定的障碍。在Jdon上有几篇不错的Jboss配置文档，可以用来参考：<a class=ilink href="http://www.jdon.com/idea.html" target=_blank><u><font color=#0000ff>http://www.jdon.com/idea.html</font></u></a> <br><br><strong>四、 Java应用的运行环境</strong> <br><br>Java的应用可以简单分为以下几个方面： <br><br><strong>1、 Java的桌面应用</strong> <br>桌面应用一般仅仅需要JRE的支持就足够了。 <br><br><strong>2、 Java Web应用</strong> <br>Java的Web应用至少需要安装JDK和一个web容器（例如Tomcat），以及一个多用户数据库，Web应用至少分为三层： <br>Browser层：浏览器显示用户页面 <br>Web层：运行Servlet/JSP <br>DB层：后端数据库，向Java程序提供数据访问服务 <br><br><strong>3、 Java企业级应用</strong> <br>企业级应用比较复杂，可以扩展到n层，最简单情况会分为4层： <br>Browser层：浏览器显示用户页面 <br>Client层：Java客户端图形程序（或者嵌入式设备的程序）直接和Web层或者EJB层交互 <br>Web层：运行Servlet/JSP <br>EJB层：运行EJB，完成业务逻辑运算 <br>DB层：后端数据库，向Java程序提供数据访问服务 <br><br><strong>4、 Java嵌入式应用</strong> <br>Java嵌入式应用是一个方兴未艾的领域，从事嵌入式开发，需要从Sun下载J2ME开发包，J2ME包含了嵌入式设备专用虚拟机KVM，和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。 <br><br><strong>Java Learning Path（二）、书籍篇</strong> <br><br>学习一门新的知识，不可能指望只看一本，或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。 <br><br>在这里我只想补充一点看法，很多人学习Java是从《Thinking in Java》这本书入手的，但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系，而是一种跳跃式的写作方法，是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。 <br><br>对于初学者来说，最好是找一本Java入门的书籍，但是比较完整的循序的介绍Java的语法，面向对象的特性，核心类库等等，在看这本书的同时，可以同步来看《Thinking in Java》，来加深对Java的理解和原理的运用，同时又可以完整的了解Java的整个体系。 <br><br>对于Java的入门书籍，蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition（针对C++背景）》，我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。 <br><br>在所有的Java书籍当中，其实最最有用的，并不是O'reilly的 Java Serials，真正最最有用处是JDK的Documentation！几乎你想获得的所有的知识在Documentation里面全部都有，其中最主要的部分当然是Java基础类库的API文档，是按照package来组织的，对于每一个class都有详细的解释，它的继承关系，是否实现了某个接口，通常用在哪些场合，还可以查到它所有的public的属性和方法，每个属性的解释，意义，每个方法的用途，调用的参数，参数的意义，返回值的类型，以及方法可能抛出的异常等等。可以这样来说，所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言，和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗，如果你有足够的能力来直接通过Documentation来学习Java的类库，那么基本上就不需要看其他的书籍了。除此之外，Documentation也是编程必备的手册，我的桌面上有三个Documentation的快捷方式，分别是J2SDK1.4.1的Documentation，Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了这个三个Documentation，什么其他的书籍都不需要了。 <br><br>对于Java Web 编程来说，最核心的是要熟悉和掌握HTTP协议，这个就和Java无关了，在熟悉HTTP协议之后，就需要熟悉Java的实现HTTP协议的类库，也就是Servlet API，所以最重要的东西就是Servlet API。当然对于初学者而言，直接通过Servlet API来学习Web编程有很大的难度，我推荐O'reilly的《Java Server Pages 》这本书来学习Web 编程。 <br><br>EJB的书籍当中，《Enterprise JavaBeans, 2nd Edition》是一本很不错的书， EJB的学习门槛是比较高，入门很难，但是这本书完全降低了学习的难度，特别重要的一点是，EJB的学习需要结合一种App Server的具体实现，所以在学习EJB的同时，必须同步的学习某种App Server，而这本书相关的出了三本书，分别是Weblogic6.1，Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论，又有实践。在学习EJB的同时，可以边看边做，EJB的学习会变得很轻松。 <br><br>但是这本书也有一个问题，就是版本比较旧，主要讲EJB1.1规范和部分EJB2.0的规范。而Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的，深入浅出，覆盖了EJB编程的各个方面，并且还有很多编程经验tips，也是学习EJB非常推荐的书籍之一。 <br><br>如果是结合Weblogic来学习J2EE的话，《J2EE应用与BEA Weblogic Server》绝对是首选读物，虽然是讲述的Weblogic6.0，仍然值得购买，这本书是BEA官方推荐的教材，作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署，实践指导意义非常强。 <br><br>在掌握了Java平台基础知识和J2EE方面的知识以后，更进一步的是学习如何运用OO的方法进行软件的设计，那么就一定要学习&#8220;设计模式&#8221;。Sun公司出版了一本《J2EE核心模式》，是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式，是设计师的必读书籍。 <br><br><strong>Java Learning Path（三）过程篇</strong> <br><br>每个人的学习方法是不同的，一个人的方法不见得适合另一个人，我只能是谈自己的学习方法。因为我学习Java是完全自学的，从来没有问过别人，所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法，只能给大家提供一点参考了。 <br><br>学习Java的第一步是安装好JDK，写一个Hello World，? 其实JDK的学习没有那么简单，关于JDK有两个问题是很容易一直困扰Java程序员的地方：一个是CLASSPATH的问题，其实从原理上来说，是要搞清楚JRE的ClassLoader是如何加载Class的；另一个问题是package和import问题，如何来寻找类的路径问题。把这两个问题摸索清楚了，就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》，对这两个问题进行了深入的探讨。 <br><br>第二步是学习Java的语法。Java的语法是类C++的，基本上主流的编程语言不是类C，就是类C++的，没有什么新东西，所以语法的学习，大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法，public，protected，private，static，什么时候用，为什么要用，怎么用，这可能需要有人来指点一下，我当初是完全自己琢磨出来的，花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。 <br><br>第三步是学习Java的面向对象的编程语言的特性的地方。比如继承，构造器，抽象类，接口，方法的多态，重载，覆盖，Java的异常处理机制。对于一个没有面向对象语言背景的人来说，我觉得这个过程需要花很长很长时间，因为学习Java之前没有C++的经验，只有C的经验，我是大概花了一个月左右吧，才彻底把这些概念都搞清楚，把书上面的例子反复的揣摩，修改，尝试，把那几章内容反复的看过来，看过去，看了不下5遍，才彻底领悟了。不过我想如果有C++经验的话，应该一两天时间足够了。那么在这个过程中，可以多看看《Thinking in Java》这本书，对面向对象的讲解非常透彻。可惜的是我学习的时候，并没有看到这本书，所以自己花了大量的时间，通过自己的尝试和揣摩来学会的。 <br><br>第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个，我没有统计过。但是真正对于我们来说最核心的只有4个，分别是 <br>java.lang.*; <br>java.io.*; <br>java.util.*; <br>java.sql.*; <br><br>这四个包的学习，每个包的学习都可以写成一本厚厚的教材，而O'reilly也确实是这样做的。我觉得如果时间比较紧，是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的： <br>首先要通读整个package的框架，了解整个package的class，interface，exception的构成，最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。 <br><br>对包整体框架的把握并不是要熟悉每个类的用法，记住它有哪些属性，方法。想记也记不住的。而是要知道包有哪些方面的类构成的，这些类的用途是什么，最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包，所以不可能详细的介绍每个类的用法，但是我反复强调，我给你们讲这些包的不是要告诉你们类的方法是怎么调用的，也不要求你们记住类的方法调用，而是要你们了解，Java给我们提供了哪些类，每个类是用在什么场合，当我遇到问题的时候，我知道哪个类，或者哪几个类的组合可以解决我的问题，That'all！，当我们具体写程序的时候，只要你知道该用哪个类来完成你的工作就足够了。编码的时候，具体的方法调用，是边写代码，边查Documentation，所有的东西都在Documentation里面，不要求你一定记住，实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。 <br><br>第五步，通过上面的学习，如果学的比较扎实的话，就打好了Java的基础了，剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步，Java的自学能力已经被培养出来了，可以到了直接学习Documentation的水平了。除了要做GUI编程之外，JDK里面其他会有用处的包是这些： <br>java.text.*; <br>java.net.*; <br>javax.naming.*; <br>这些包里面真正用的比较多的类其实很少，只有几个，所以不需要花很多时间。 <br><br>第六步，Java Web 编程，Web编程的核心是HTTP协议，HTTP协议和Java无关，如果不熟悉HTTP协议的话，虽然也可以学好Servlet/JSP编程，但是达不到举一反三，一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话，又有了Java编程的良好的基础，学习Servlet/JSP简直易如反掌，我学习Servlet/JSP就用了不到一周的时间，然后就开始用JSP来做项目了。 <br><br>在Servlet/JSP的学习中，重头仍然是Servlet Documentation。Servlet API最常用的类很少，花比较少的时间就可以掌握了。把这些类都看一遍，多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对JSP，还需要熟悉几个常用JSP的标记，具体的写法记不住的话，临时查就是了。 <br><br>此外Java Web编程学习的重点要放在Web Application的设计模式上，如何进行业务逻辑的分析，并且进行合理的设计，按照MVC设计模式的要求，运用Servlet和JSP分别完成不同的逻辑层，掌握如何在Servlet和JSP之间进行流程的控制和数据的共享，以及Web Application应该如何配置和部署。 <br><br><strong>第七步，J2EE编程</strong> <br>以上的学习过程如果是比较顺利的话，进行到这一步，难度又陡然提高。因为上面的知识内容都是只涉及一个方面，而像EJB，JMS，JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶，所以掌握起来难度比较大。 <br><br>首先一定要学习好JNDI，JNDI是App Server定位服务器资源（EJB组件，Datasouce，JMS）查找方法，如果对JNDI不熟悉的话，EJB，JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包，运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置，就需要看看专门的文档规范了，比如web.xml的写法，ejb-jar.xml的写法等等。针对每种不同的App Server，还有自己的服务资源配置文件，也是需要熟悉的。 <br><br>然后可以学习JTA，主要是要理解JTA对于事务的控制的方法，以及该在什么场合使用JTA。这里可以简单的举个例子，我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),....,conn.commit())，做为一个原子操作，但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作，你能做的到吗？这时候只能用JTA了。假设操作过程是先往A数据库插一条记录，然后删除B数据库另一个记录，我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话，由App Server来完成控制。 <br><br>在学习EJB之前要学习对象序列化和RMI，RMI是EJB的基础。接着学习JMS和EJB，对于EJB来说，最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的，以及在什么情况下要用到EJB。 <br><br>在学习完EJB，JMS这些东西之后，你可能会意识到要急不可待学习两个领域的知识，一个是UML，另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计，一个好的软件框架是软件开发成功的必要条件。在这个时候，应该开始把学习的重点放在设计模式和框架的学习上，通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。 <br><br>J2EE规范里面，除了EJB，JMS，JTA，Servlet/JSP，JDBC之外还有很多很多的企业技术，这里不一一进行介绍了。 <br><br>另外还有一个最新领域Web Services。Web Services也完全没有任何新东西，它像是一种黏合剂，可以把不同的服务统一起来提供一个统一的调用接口，作为使用者来说，我只要获得服务提供者给我的WSDL（对服务的描述），就够了，我完全不知道服务器提供者提供的服务究竟是EJB组件，还是.Net组件，还是什么CORBA组件，还是其他的什么实现，我也不需要知道。Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式，实现了整个Internet服务的共享，是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍，但是可以通过在网络上面查资料的方式来学习。 <br><br><strong>Java Learning Path（四） 方法篇</strong> <br><br>Java作为一门编程语言，最好的学习方法就是写代码。当你学习一个类以后，你就可以自己写个简单的例子程序来运行一下，看看有什么结果，然后再多调用几个类的方法，看看运行结果，这样非常直观的把类给学会了，而且记忆非常深刻。然后不应该满足把代码调通，你应该想想看如果我不这样写，换个方式，再试试行不行。记得哪个高人说过学习编程就是个破坏的过程，把书上的例子，自己学习Documentation编写的例子在运行通过以后，不断的尝试着用不同的方法实现，不断的尝试破坏代码的结构，看看它会有什么结果。通过这样的方式，你会很彻底的很精通的掌握Java。 <br><br>举个例子，我们都编过Hello World <br><br></p>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre><font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>class</strong></font> HelloWorld <font class=java-bracket>{</font>
            <font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>static</strong></font> <font class=java-reserved_word><strong>void</strong></font> main(String[] args) <font class=java-bracket>{</font>
            System.out.println(<font class=java-string>"Hello World"</font>);
            <font class=java-bracket>}</font>
            <font class=java-bracket>}</font>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args)，能不能不这样写？包括我刚学习Java的时候也有这样的疑问。想知道答案吗？很简单，你把main改个名字运行一下，看看报什么错误，然后根据出错信息进行分析；把main的public取掉，在试试看，报什么错误；static去掉还能不能运行；不知道main方法是否一定要传一个String[]数组的，把String[]改掉，改成int[]，或者String试试看；不知道是否必须写args参数名称的，也可以把args改成别的名字，看看运行结果如何。 <br><br>我当初学习Java的时候就是这样做的，把Hello World程序反复改了七八次，不断运行，分析运行结果，最后就彻底明白为什么了main方法是这样定义的了。 <br><br>此外，我对于staic，public，private，Exception，try{ }catch {}finally{}等等等等一开始都不是很懂，都是把参考书上面的例子运行成功，然后就开始破坏它，不断的根据自己心里面的疑问来重新改写程序，看看能不能运行，运行出来是个什么样子，是否可以得到预期的结果。这样虽然比较费时间，不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行，看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。 <br><br>其中特别值得一提的是JDK有一个非常棒的调试功能，-verbose <br>java &#8211;verbose <br>javac &#8211;verbose 以及其它很多JDK工具都有这个选项 <br>-verbose 可以显示在命令执行的过程中，JVM都依次加载哪里Class，通过这些宝贵的调试信息，可以帮助我们分析出JVM在执行的过程中都干了些什么。 <br><br>另外，自己在学习过程中，写的很多的这种破坏例程，应该有意识的分门别类的保存下来，在工作中积累的典型例程也应该定期整理，日积月累，自己就有了一个代码库了。遇到类似的问题，到代码库里面 Copy &amp; Paste ，Search &amp; Replace，就好了，极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层，形成一个通用的类库，封装好。那么可复用性就更强了。 <br><br>所以我觉得其实不是特别需要例程的，自己写的破坏例程就是最好的例子，如果你实在对自己写的代码不放心的话，我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip，解开来就可以完整的看到整个JDK基础类库，也就是rt.jar的Java源代码，你可以参考一下Sun是怎么写Java程序的，规范是什么样子的。我自己在学习Java的类库的时候，当有些地方理解的不是很清楚的时候，或者想更加清晰的理解运作的细节的时候，往往会打开相应的类的源代码，通过看源代码，所有的问题都会一扫而空。 <br><br><strong>Java Learning Path（五）资源篇</strong> <br><br>1、 <a class=ilink href="http://java.sun.com/" target=_blank><u><font color=#0000ff>http://java.sun.com/</font></u></a> (英文) <br>Sun的Java网站，是一个应该经常去看的地方。不用多说。 <br><br>2、<a class=ilink href="http://www-900.ibm.com/developerWorks/cn/" target=_blank><u><font color=#0000ff>http://www-900.ibm.com/developerWorks/cn/</font></u></a> <br>IBM的developerWorks网站，英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站，也是Web Services，Java，Linux极好的网站。强烈推荐！！！ <br><br>3、<a class=ilink href="http://www.javaworld.com/" target=_blank><u><font color=#0000ff>http://www.javaworld.com/</font></u></a> (英文) <br>关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用，这里比较好。 <br><br>4、<a class=ilink href="http://dev2dev.bea.com.cn/index.jsp" target=_blank><u><font color=#0000ff>http://dev2dev.bea.com.cn/index.jsp</font></u></a> <br>BEA的开发者园地，BEA作为最重要的App Server厂商，有很多独到的技术，在Weblogic上做开发的朋友不容错过。 <br><br>5、<a class=ilink href="http://www.huihoo.com/" target=_blank><u><font color=#0000ff>http://www.huihoo.com/</font></u></a> <br>灰狐动力网站，一个专业的中间件网站，虽然不是专业的Java网站，但是在J2EE企业应用技术方面有深厚的造诣。 <br><br>6、<a class=ilink href="http://www.theserverside.com/" target=_blank><u><font color=#0000ff>http://www.theserverside.com/</font></u></a> (英文) <br>TheServerSide是一个著名的专门面向Java Server端应用的网站。 <br><br>7、<a class=ilink href="http://www.javaresearch.org/" target=_blank><u><font color=#0000ff>http://www.javaresearch.org/</font></u></a> <br>Java研究组织，有很多优秀的Java方面的文章和教程，特别是在JDO方面的文章比较丰富。 <br><br>8、<a class=ilink href="http://www.cnjsp.org/" target=_blank><u><font color=#0000ff>http://www.cnjsp.org/</font></u></a> <br>JSP技术网站，有相当多的Java方面的文章和资源。 <br><br>9、<a class=ilink href="http://www.jdon.com/" target=_blank><u><font color=#0000ff>http://www.jdon.com/</font></u></a> <br>Jdon论坛，是一个个人性质的中文J2EE专业技术论坛，在众多的Java的中文论坛中，Jdon一个是技术含量非常高，帖子质量非常好的论坛。 <br><br>10、<a class=ilink href="http://sourceforge.net/" target=_blank><u><font color=#0000ff>http://sourceforge.net/</font></u></a> <br>SourgeForge是一个开放源代码软件的大本营，其中也有非常非常丰富的Java的开放源代码的著名的软件。 <br><br><img src="http://www.javaworld.com.tw/jute/images_zh_TW/attachment.gif" align=absMiddle border=0><a href="http://www.javaworld.com.tw/jute/user/download/14954/Java%20Learning%20Path.doc" target=_blank><u><font color=#000080>Java Learning Path.doc</font></u></a> (78.0k) </span><br>
<img src ="http://www.blogjava.net/beansoft/aggbug/116729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-05-11 13:41 <a href="http://www.blogjava.net/beansoft/archive/2007/05/11/116729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>給 Java 新手的一封信 [精華](zz)</title><link>http://www.blogjava.net/beansoft/archive/2007/05/11/116720.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Fri, 11 May 2007 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/05/11/116720.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/116720.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/05/11/116720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/116720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/116720.html</trackback:ping><description><![CDATA[<p><a title=http://www.javaworld.com.tw/jute/post/view?bid=29&amp;id=7005&amp;sty=1&amp;tpg=1&amp;age=0 href="http://www.javaworld.com.tw/jute/post/view?bid=29&amp;id=7005&amp;sty=1&amp;tpg=1&amp;age=0">http://www.javaworld.com.tw/jute/post/view?bid=29&amp;id=7005&amp;sty=1&amp;tpg=1&amp;age=0</a></p>
<p>&nbsp;</p>
<p><span class=javascript id=text7005>&nbsp;親愛的 java 新手們 : <br><br>很高興你們願意來這裡共同學習, <br>Java 這個語言, 已經不再是語言了, 他勾勒出一個開放式的開發環境, <br>基本上 java.sun.com 很粗略地把 Java 分為三個部分 <br><br>(1) J2SE ( Java 2 Standard Edition ) <br>(2) J2EE ( Java 2 Enterprise Edition ) <br>(3) J2ME ( Java 2 Micro Edition ) <br><br>新手, 大概都要由 J2SE 開始學習, <br>比較需要了解的就是 SCJP 考題的範圍 <br>剛開始你大可不必花時間去研究 AWT 或 Swing 的基本概念 <br>但是我認為你們要對基本語法及資料結構要清楚 <br>接著, 必須學會如何查詢 API ( javadoc ) <br><br>其實, Java 並不難學, 比 VB 難一些些, <br>但是可以處理的範圍卻比 VB 大很多, <br>只要能夠設定好 jdk 與 classpath, <br>開發就沒有太大問題, <br>剛開始我會建議你們直接使用 UltraEdit 或 EditPlus 這些文書處理工具 <br>練習來建立簡單的 variable, loop 等等... <br>接著學習一些 free 的 IDE , eclipse, netbeans and etc.. ( 請參閱 IDE 版 ) <br><br>很多人會拿 C 和 Java 相比較 <br>基本上, Java 處理硬體的能力大多要透過 JNI 與 Driver 溝通 <br>架構在 JVM 上面執行效能也很難與 C 抗衡 <br>但是, 簡單容易上手 是他的優勢 <br>OO 程式設計也隨著 java 的發展突飛猛進, <br>相對的, 在學的學生, 尤其是資訊相關科系的, <br>可以順便了解 UML 及軟體工程, <br>這個站有許多高手會替你解答疑問的 <br><br>所謂的 Java 高手其實沒有什麼 ( sorry, 諸位高手.... ) <br>可能是讀了比較多的技術文件或知道比較多的資源可以利用 <br>一個語言能夠讓工程師輕易地建構出一套系統 <br>就是很好的語言, 所以你們可以很快樂地開始學習 <br>更重要的事情, 使用 java 開發的人們 <br>非常熱心開放他們的原始碼, <br>你們可以使用他們的 binary jar, 或參考他們的 source code <br>堆疊出你們想要建立的系統 ( plz check their license ) <br><br>等到你能夠寫出九九乘法表, 控制住一些 collection, <br>能夠讀得懂 Java API 的 javadoc , <br>你大概就可以做一些選擇 <br>想要做 application , 就可以鑽研於 awt , swing 等等 <br>想要做 webapps, 就可以鑽研 jsp/servlet 等等 <br>想要做 pda/ phone, 就可以鑽研 midp, j2me 等等 <br><br>台灣之所以為台灣, 就是因為我們擁有一個快樂的學習環境, <br>大家相互提拔, 相互學習, 相互分享, 相互良性競爭... <br><br>　　　　　　　　　　　　　　　　　　　　　一個與 Java 一起成長的人... <br>　　　　　　　　　　　　　　　　　　　　　jini (99% jakarta ) </span></p>
<img src ="http://www.blogjava.net/beansoft/aggbug/116720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-05-11 13:23 <a href="http://www.blogjava.net/beansoft/archive/2007/05/11/116720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK 1.6 的 jrunscript.exe 用途</title><link>http://www.blogjava.net/beansoft/archive/2007/05/04/115314.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Fri, 04 May 2007 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/05/04/115314.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/115314.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/05/04/115314.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/115314.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/115314.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天大家讨论说发现 JDK 1.6 安装目录下有个 jrunscript.exe, 不知道是干啥的&nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2007/05/04/115314.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/115314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-05-04 15:12 <a href="http://www.blogjava.net/beansoft/archive/2007/05/04/115314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2SE 基础学习: 都该学习哪些包?</title><link>http://www.blogjava.net/beansoft/archive/2007/03/29/107298.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Thu, 29 Mar 2007 10:30:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/03/29/107298.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/107298.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/03/29/107298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/107298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/107298.html</trackback:ping><description><![CDATA[java\lang    根目录必看; 其它可选, 不做框架, 反射不看<br />java\beans    可选; 不做框架, 反射工具不看<br />java\io        必看<br />java\math    可选, 不做数学应用不看<br />java\net    必看, 理解 HTTP, FTP, Socket, UDP, TCP 都在这里<br />java\nio    可选, 不自己写服务器不看<br />java\rmi(可以简单学习, 对理解 EJB, JNDI 和远程调用有利)<br />java\sql    必看<br />java\text    国际化, 日期解析等<br />java\util    必看, 集合, 数据结构, 以及基本的工具类, 如定时器, 加载配置文件等<img src ="http://www.blogjava.net/beansoft/aggbug/107298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-03-29 18:30 <a href="http://www.blogjava.net/beansoft/archive/2007/03/29/107298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面试常见问题1: 字符串分割</title><link>http://www.blogjava.net/beansoft/archive/2007/03/08/102659.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Thu, 08 Mar 2007 10:44:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/03/08/102659.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/102659.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/03/08/102659.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/102659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/102659.html</trackback:ping><description><![CDATA[<p>下午面试两个同志, 感觉现在的同志们是 Spring, Hibernate 很熟悉, 但是 J2SE 反而陌生了.</p> <p>可以用两个方法来分割字符串为数组.</p> <p><strong>1. java.lang.String 的 split() 方法, JDK 1.4 or later</strong></p> <p>&nbsp;</p> <h5>split</h5><pre>public <a href="http://gceclub.sun.com.cn/java/lang/String.html">String</a>[] <b>split</b>(<a href="http://gceclub.sun.com.cn/java/lang/String.html">String</a>&nbsp;regex,
                      int&nbsp;limit)</pre>
<dl>
<dd>根据匹配给定的<a href="http://gceclub.sun.com.cn/java/util/regex/Pattern.html#sum">正则表达式</a>来拆分此字符串。 
<p>此方法返回的数组包含此字符串的每个子字符串，这些子字符串由另一个匹配给定的表达式的子字符串终止或由字符串结束来终止。数组中的子字符串按它们在此字符串中的顺序排列。如果表达式不匹配输入的任何部分，则结果数组只具有一个元素，即此字符串。 
<p><tt>limit</tt> 参数控制模式应用的次数，因此影响结果数组的长度。如果该限制 <i>n</i> 大于 0，则模式将被最多应用 <i>n</i>&nbsp;-&nbsp;1 次，数组的长度将不会大于 <i>n</i>，而且数组的最后项将包含超出最后匹配的定界符的所有输入。如果 <i>n</i> 为非正，则模式将被应用尽可能多的次数，而且数组可以是任意长度。如果 <i>n</i> 为零，则模式将被应用尽可能多的次数，数组可有任何长度，并且结尾空字符串将被丢弃。 
<p>例如，字符串 <tt>"boo:and:foo"</tt> 使用这些参数可生成下列结果： 
<blockquote>
<p>Regex<br>Limit<br>结果
<p>:<br>2<br><tt>{ "boo", "and:foo" }</tt>
<p>:<br>5<br><tt>{ "boo", "and", "foo" }</tt>
<p>:<br>-2<br><tt>{ "boo", "and", "foo" }</tt>
<p>o<br>5<br><tt>{ "b", "", ":and:f", "", "" }</tt>
<p>o<br>-2<br><tt>{ "b", "", ":and:f", "", "" }</tt>
<p>o<br>0<br><tt>{ "b", "", ":and:f" }</tt></p></blockquote>
<p>这种形式的方法调用 <i>str.</i><tt>split(</tt><i>regex</i><tt>,</tt> <i>n</i><tt>)</tt> 产生与以下表达式完全相同的结果： 
<blockquote><a href="http://gceclub.sun.com.cn/java/util/regex/Pattern.html"><code>Pattern</code></a>.<a href="http://gceclub.sun.com.cn/java/util/regex/Pattern.html#compile(java.lang.String)"><code>compile</code></a><tt>(</tt><i>regex</i><tt>)</tt>.<a href="http://gceclub.sun.com.cn/java/util/regex/Pattern.html#split(java.lang.CharSequence, int)"><code>split</code></a><tt>(</tt><i>str</i><tt>,</tt> <i>n</i><tt>)</tt></blockquote>
<dd>
<dl></dl>
<dd>
<dl>
<dt><b>参数：</b>
<dd><code>regex</code> - 定界正则表达式 
<dd><code>limit</code> - 结果阈值，如上所述 
<dt><b>返回：</b>
<dd>字符串数组，根据给定正则表达式的匹配来拆分此字符串，从而生成此数组 
<dt><b>抛出：</b>
<dd><code><a href="http://gceclub.sun.com.cn/java/util/regex/PatternSyntaxException.html">PatternSyntaxException</a></code> - 如果正则表达式的语法无效 
<dt><b>从以下版本开始：</b>
<dd>1.4 
<dt><b>另请参见：</b>
<dd><a href="http://gceclub.sun.com.cn/java/util/regex/Pattern.html"><code>Pattern</code></a></dd></dl></dd></dl>
<hr>
<a></a>
<h5>split</h5><pre>public <a href="http://gceclub.sun.com.cn/java/lang/String.html">String</a>[] <b>split</b>(<a href="http://gceclub.sun.com.cn/java/lang/String.html">String</a>&nbsp;regex)</pre>
<dl>
<dd>根据给定的正则表达式的匹配来拆分此字符串。 
<p>该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 <a href="http://gceclub.sun.com.cn/java/lang/String.html#split(java.lang.String, int)"><code>split</code></a> 方法。因此，结果数组中不包括结尾空字符串。 
<p>例如，字符串 <tt>"boo:and:foo"</tt> 产生带有下面这些表达式的结果： 
<blockquote>
<p>Regex<br>结果
<p>:<br><tt>{ "boo", "and", "foo" }</tt>
<p>o<br><tt>{ "b", "", ":and:f" }</tt></p></blockquote>
<dd>
<dl></dl>
<dd>
<dl>
<dt><b>参数：</b>
<dd><code>regex</code> - 定界正则表达式 
<dt><b>返回：</b>
<dd>字符串数组，根据给定正则表达式的匹配来拆分此字符串，从而生成此数组。 
<dt><b>抛出：</b>
<dd><code><a href="http://gceclub.sun.com.cn/java/util/regex/PatternSyntaxException.html">PatternSyntaxException</a></code> - 如果正则表达式的语法无效 
<dt><b>从以下版本开始：</b>
<dd>1.4 
<dt><b>另请参见：</b>
<dd><a href="http://gceclub.sun.com.cn/java/util/regex/Pattern.html"><code>Pattern</code></a></dd></dl></dd></dl>
<p><strong>2. java.util.Tokenizer JDK 1.0 or later</strong></p>
<p><strong></strong>&nbsp;</p>
<p><strong></strong>&nbsp;</p>
<p>string tokenizer 类允许应用程序将字符串分解为标记。tokenization 方法比 <code>StreamTokenizer</code> 类所使用的方法更简单。<code>StringTokenizer</code> 方法不区分标识符、数和带引号的字符串，它们也不识别并跳过注释。 
<p>可以在创建时指定，也可以根据每个标记来指定分隔符（分隔标记的字符）集合。 
<p><code>StringTokenizer</code> 的实例有两种行为方式，这取决于它在创建时使用的 <code>returnDelims</code> 标志的值是 <code>true</code> 还是 <code>false</code>： 
<ul>
<li>如果标志为 <code>false</code>，则分隔符字符用来分隔标记。标记是连续字符（不是分隔符）的最大序列。 
<li>如果标志为 <code>true</code>，则认为那些分隔符字符本身即为标记。因此标记要么是一个分隔符字符，要么是那些连续字符（不是分隔符）的最大序列。 </li></ul>
<p><tt>StringTokenizer</tt> 对象在内部维护字符串中要被标记的当前位置。某些操作将此当前位置移至已处理的字符后。 
<p>通过截取字符串的一个子串来返回标记，该字符串用于创建 <tt>StringTokenizer</tt> 对象。 
<p>下面是一个使用 tokenizer 的实例。代码如下： 
<blockquote><pre>     StringTokenizer st = new StringTokenizer("this is a test");
     while (st.hasMoreTokens()) {
         System.out.println(st.nextToken());
     }
 </pre></blockquote>
<p>输出以下字符串： 
<blockquote><pre>     this
     is
     a
     test</pre></blockquote><pre><tt>StringTokenizer</tt> 是出于兼容性的原因而被保留的遗留类（虽然在新代码中并不鼓励使用它）。建议所有寻求此功能的人使用 <tt>String</tt> 的 <tt>split</tt> 方法或 java.util.regex 包。 </pre>
<p>下面的示例阐明了如何使用 <tt>String.split</tt> 方法将字符串分解为基本标记： 
<blockquote><pre>     String[] result = "this is a test".split("\\s");
     for (int x=0; x&lt;result.length; x++)
         System.out.println(result[x]);
 </pre></blockquote>
<p>输出以下字符串： 
<blockquote><pre>     this
     is
     a
     test
 </pre></blockquote>
<dl>
<dt><b>从以下版本开始：</b>
<dd>JDK1.0 
<dt><b>另请参见：</b>
<dd><a href="http://gceclub.sun.com.cn/java/io/StreamTokenizer.html"><code>StreamTokenizer</code></a></dd></dl><img src ="http://www.blogjava.net/beansoft/aggbug/102659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-03-08 18:44 <a href="http://www.blogjava.net/beansoft/archive/2007/03/08/102659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase Testing Ref - Sybase Identity</title><link>http://www.blogjava.net/beansoft/archive/2007/02/06/98399.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Tue, 06 Feb 2007 09:56:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/02/06/98399.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/98399.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/02/06/98399.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/98399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/98399.html</trackback:ping><description><![CDATA[
<h1 style="MARGIN: 0cm 0cm 0pt"><o:p/></h1>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt; TEXT-ALIGN: center" align="center"><span style="FONT-SIZE: 29pt; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Sybase Identity<o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt; TEXT-ALIGN: center" align="center"><o:p/></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt; TEXT-ALIGN: center" align="center"><span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">***********<o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt; TEXT-ALIGN: center" align="center"><span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">June 2006 <o:p/></span></span></h2>
<h1 style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 'Arial Unicode MS'">About the tutorial<o:p/></span></h1>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">To introduce some basic concepts of IDENTITY <o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">To introduce how to use IDENTITY properly<o:p/></span></span></h2>
<h1 style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 'Arial Unicode MS'">Basic Concept<o:p/></span></h1>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">What</span></span><span style="FONT-FAMILY: Arial; mso-ascii-font-family: Tahoma">'</span><span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">s IDENTITY<o:p/></span></span></h2>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo2"><span style="FONT-FAMILY: Arial; mso-fareast-font-family: Arial"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em">-</span> </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em"><span style="FONT-FAMILY: Tahoma">Auto increment column<o:p/></span></span></span></h3>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Advantage of IDENTITY<o:p/></span></span></h2>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo3"><span style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: Arial; mso-bidi-font-size: 14.0pt"><span style="mso-list: Ignore">- </span></span> <span style="FONT-SIZE: 12pt; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Auto generated, high efficiency</span></span></h3>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Using IDENTITY<o:p/></span></span></h2>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo3"><span style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: Arial"><span style="mso-list: Ignore">- </span></span> <span style="FONT-SIZE: 12pt; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Number leaking<o:p/></span></span></h3>
<h1 style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 'Arial Unicode MS'">Basic Concept<o:p/></span></h1>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">DDL in creating TABLE<o:p/></span></span></h2>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo2"><span style="FONT-FAMILY: Arial; mso-fareast-font-family: Arial"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em">-</span> </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em"><span style="FONT-FAMILY: Tahoma">ColumnName numeric(N) identity<o:p/></span></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo2"><span style="FONT-FAMILY: Arial; mso-fareast-font-family: Arial"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em">-</span> </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em"><span style="FONT-FAMILY: Tahoma">with identity_gap = M (optional)<o:p/></span></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo2"><span style="FONT-FAMILY: Arial; mso-fareast-font-family: Arial"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em">-</span> </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em"><span style="FONT-FAMILY: Tahoma">Default gap is 0, using server setting<o:p/></span></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo2"><span style="FONT-FAMILY: Arial; mso-fareast-font-family: Arial"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em">-</span> </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em"><span style="FONT-FAMILY: Tahoma">Data type can be INTEGER, and numeric(N), N [1,31]<o:p/></span></span></span></h3>
<h1 style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 'Arial Unicode MS'">Basic Concept</span><span lang="ZH-CN" style="FONT-FAMILY: 'Arial Unicode MS'; mso-ansi-language: ZH-CN" xml:lang="ZH-CN"><o:p/></span></h1>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Sample DDL<o:p/></span></span></h2>
<h3 style="MARGIN: 0cm 0cm 0pt 29.25pt"><span style="FONT-SIZE: 10pt; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">CREATE TABLE order_main(<o:p/></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 29.25pt"><span style="FONT-SIZE: 10pt; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">order_no NUMERIC(20) IDENTITY<o:p/></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 29.25pt"><span style="FONT-SIZE: 10pt; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">,cust_no NUMERIC(20) NOT NULL<o:p/></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 29.25pt"><span style="FONT-SIZE: 10pt; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">,comments VARCHAR(256) NULL<o:p/></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 29.25pt"><span style="FONT-SIZE: 10pt; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">)<o:p/></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 29.25pt"><span style="FONT-SIZE: 10pt; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">LOCK DATAROWS<o:p/></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 29.25pt"><span style="FONT-SIZE: 10pt; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">WITH IDENTITY_GAP=100<o:p/></span></span></h3>
<h1 style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 'Arial Unicode MS'">Basic Concept<o:p/></span></h1>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Identity Gap<o:p/></span></span></h2>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt"><o:p/></h3>
<h1 style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 'Arial Unicode MS'">Basic Concept<o:p/></span></h1>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Sp_help TableName</span></span></h2>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo2"><span style="FONT-FAMILY: Arial; mso-fareast-font-family: Arial"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em">-</span> </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em"><span style="FONT-FAMILY: Tahoma">Show which field is identity<o:p/></span></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo2"><span style="FONT-FAMILY: Arial; mso-fareast-font-family: Arial"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em">-</span> </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em; FONT-FAMILY: Tahoma">Show the value of identity_gap</span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo2"><span style="FONT-FAMILY: Arial; mso-fareast-font-family: Arial"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em">-</span> </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em"><span style="FONT-FAMILY: Tahoma">sample<o:p/></span></span></span></h3>
<h1 style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 'Arial Unicode MS'">Other Issues<o:p/></span></h1>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Only one identity column in a table<o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="FONT-FAMILY: Tahoma"><span style="mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">Identity value cannot be reset</span><span style="mso-hansi-font-family: Tahoma"><o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Initial value is always 1<o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Manually insert on identity column<o:p/></span></span></h2>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo4"><span style="mso-fareast-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-bidi-font-size: 8.0pt"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em; FONT-FAMILY: Tahoma">-</span> </span></span> <span style="FONT-FAMILY: Tahoma"><span style="mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em">Set identity_insert Table on/off</span></span><span style="FONT-SIZE: 8pt; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma"> <o:p/></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo4"><span style="mso-fareast-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em; FONT-FAMILY: Tahoma">-</span> </span></span> <span style="mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em"><span style="FONT-FAMILY: Tahoma">session scope<o:p/></span></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo4"><span style="mso-fareast-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em; FONT-FAMILY: Tahoma">-</span> </span></span> <span style="mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em"><span style="FONT-FAMILY: Tahoma">Only one table with identity_insert on in a session<o:p/></span></span></span></h3>
<h1 style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 'Arial Unicode MS'">Other Issues<o:p/></span></h1>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">@@identity</span></span> <span style="FONT-FAMILY: Arial; mso-ascii-font-family: Tahoma">-</span><span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">session scope<o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">reach maximum value<o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Modify identity_gap</span></span></h2>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo2"><span style="FONT-FAMILY: Arial; mso-fareast-font-family: Arial"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em">-</span> </span></span> <span style="FONT-SIZE: 1.2em"><span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">sp_chgattribute</span></span> <span style="FONT-FAMILY: Arial; mso-ascii-font-family: Tahoma">"</span><span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">TableName","identity_gap",20<o:p/></span></span></span></h3>
<h2 style="MARGIN: 0cm 0cm 0pt 24pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Modify Global identity_gap</span></span></h2>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo2"><span style="FONT-FAMILY: Arial; mso-fareast-font-family: Arial"><span style="mso-list: Ignore"><span style="FONT-SIZE: 1.2em">-</span> </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-SIZE: 1.2em"><span style="FONT-FAMILY: Tahoma">sp_configure <o:p/></span></span></span></h3>
<h3 style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 1.2em"><span style="FONT-FAMILY: Arial; mso-ascii-font-family: Tahoma">"</span><span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">identity burning set factor</span></span><span style="FONT-FAMILY: Arial; mso-ascii-font-family: Tahoma">"</span><span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">5000<o:p/></span></span></span></h3>
<h1 style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 'Arial Unicode MS'">Other Issues</span><span lang="ZH-CN" style="FONT-FAMILY: 'Arial Unicode MS'; mso-ansi-language: ZH-CN" xml:lang="ZH-CN"><o:p/></span></h1>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt; mso-list: l0 level1 lfo1"><span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 16.0pt"><span style="mso-list: Ignore">n </span></span> <span style="mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">Sample DDL<o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt"><span style="FONT-FAMILY: Tahoma"><span style="FONT-SIZE: 10pt; mso-bidi-font-family: Tahoma">Find table with IDENTITY column:</span> <span style="mso-bidi-font-family: Tahoma"><o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt"><span style="FONT-FAMILY: Tahoma"><span style="FONT-SIZE: 10pt; mso-bidi-font-family: Tahoma">SELECT name FROM sysobjects WHERE next_identity(name) IS NOT NULL AND type='U'<o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt"><span style="FONT-FAMILY: Tahoma"><span style="FONT-SIZE: 10pt; mso-bidi-font-family: Tahoma">Change gap:<o:p/></span></span></h2>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt"><span style="FONT-FAMILY: Tahoma"><span style="FONT-SIZE: 10pt; mso-bidi-font-family: Tahoma">sp_chgattribute 'cmdm_sign_log','identity_gap',1000<o:p/></span></span></h2>
<h1 style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 'Arial Unicode MS'">The End<o:p/></span></h1>
<h2 style="MARGIN: 0cm 0cm 0pt 13.5pt; TEXT-ALIGN: center" align="center"><span style="FONT-SIZE: 20pt; mso-bidi-font-family: Tahoma"><span style="FONT-FAMILY: Tahoma">THANKS<o:p/></span></span></h2>
<img src ="http://www.blogjava.net/beansoft/aggbug/98399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-02-06 17:56 <a href="http://www.blogjava.net/beansoft/archive/2007/02/06/98399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网友答疑之编程的时候要细心</title><link>http://www.blogjava.net/beansoft/archive/2007/01/18/94727.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Thu, 18 Jan 2007 10:32:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/01/18/94727.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/94727.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/01/18/94727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/94727.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/94727.html</trackback:ping><description><![CDATA[
<p>*** 18:26:20<br/>我随便写了个代码 不知道为什么会抱错 帮我看下 好吗？<br/>package javaapplication16;</p>
<p>import java.util.*;</p>
<p>public class Main<br/>{<br/>public Main ()<br/>{<br/>}<br/>public static void main (String[] args)<br/>{<br/>Vector v = new Vector ();<br/>String [] data = new String []{"zero","one","two","three","four","five","six","seven","eight","nine","ten"};<br/>int len = data.length;<br/>System.out.println("数组长度为: "+len);<br/><br/>//<br/>HashMap map = new HashMap();<br/>for(int i = 0; i&lt;len;i++)<br/>{<br/>v.addElement (data[i]);<br/>map.put (data[i],new Integer(i));<br/>}<br/>int vlen = v.size ();<br/>System.out.println ("向量的长度:"+vlen);<br/>//遍历<br/>for(int j = 0; j&lt;vlen;j++)<br/>{<br/>System.err.println(v.get (j));<br/>}<br/>//遍历<br/>Enumeration en = v.elements ();<br/>while(en.hasMoreElements ())<br/>{<br/>String ele =(String) en.nextElement ();<br/>System.out.println (ele);<br/>}<br/>//遍历<br/>int mlen = map.size ();<br/>System.out.println ("显示map 长度"+mlen);<br/>//<br/>Iterator it = map.keySet ().iterator ();<br/>System.out.println ("!!!!!!!!!!!!!!");<br/>while(it.hasNext ())<br/>{<br/>String key = (String )it.next ();<br/>Object value = (Object) map.get (key);<br/>System.out.println("key: "+it.next ()+" value: "+value.toString ());<br/>}<br/>}<br/>}<br/><br/>BeanSoft 18:27:01<br/>什么错啊?<br/>*** 18:27:25<br/>输入信息是：<br/>数组长度为: 11<br/>向量的长度:11<br/>zero<br/>one<br/>two<br/>three<br/>four<br/>five<br/>six<br/>seven<br/>eight<br/>nine<br/>ten<br/>Exception in thread "main" java.util.NoSuchElementException<br/>at java.util.HashMap$HashIterator.nextEntry(HashMap.java:790)<br/>zero<br/>one<br/>two<br/>three<br/>four<br/>five<br/>six<br/>seven<br/>eight<br/>nine<br/>ten<br/>显示map 长度11<br/>!!!!!!!!!!!!!!<br/>key: nine value: 8<br/>key: two value: 1<br/>key: ten value: 5<br/>key: four value: 0<br/>key: seven value: 3<br/>at java.util.HashMap$KeyIterator.next(HashMap.java:823)<br/>at javaapplication16.Main.main(Main.java:48)<br/><br/>BeanSoft 18:28:55<br/>String key = (String )it.next ();<br/>Object value = (Object) map.get (key);<br/>System.out.println("key: "+it.next ()+" value: "+value.toString ());<br/><br/>BeanSoft 18:29:08<br/>你这里一下子往后走了两条, 当然报错了<br/>BeanSoft 18:29:20<br/>it.next() 只能调一下<br/>*** 18:30:27<br/>呵呵 太粗心了 谢谢<br/>*** 18:30:30<br/>ok了</p>
<img src ="http://www.blogjava.net/beansoft/aggbug/94727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-01-18 18:32 <a href="http://www.blogjava.net/beansoft/archive/2007/01/18/94727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Navicat管理Mysql 的视频</title><link>http://www.blogjava.net/beansoft/archive/2007/01/18/94583.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Thu, 18 Jan 2007 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/01/18/94583.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/94583.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/01/18/94583.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/94583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/94583.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Navicat管理Mysql 的视频<br>本来是以前开发 gongsipk.com 的时候做的视频教程, 现在整理后放上来希望能对大家有所帮助.<br><br>&nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2007/01/18/94583.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/94583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-01-18 13:04 <a href="http://www.blogjava.net/beansoft/archive/2007/01/18/94583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java调用外部进程并拦截输出流的实例: 进程管理器1.0版(原创)</title><link>http://www.blogjava.net/beansoft/archive/2007/01/16/94159.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Tue, 16 Jan 2007 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/01/16/94159.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/94159.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/01/16/94159.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/94159.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/94159.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原来的时候呢, 要反复切换四个 DOS 窗口来查看开发的应用产生的日志, 而且错误信息也不方便浏览. 后来通过使用 Java 中的进程输出流成功的解决了这个疑难问题, 并制作了一个 Java 进程启动控制中心, 能够运行, 终止, 启动这些进程, 对进程的输出进行加颜色区别显示, 使用配置文件来方便的修改/添加新的进程启动参数, 但是没有实现拦截输入流的功能.&nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2007/01/16/94159.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/94159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-01-16 10:52 <a href="http://www.blogjava.net/beansoft/archive/2007/01/16/94159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java语言编码规范(Java Code Conventions)</title><link>http://www.blogjava.net/beansoft/archive/2007/01/05/92100.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Fri, 05 Jan 2007 12:19:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/01/05/92100.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/92100.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/01/05/92100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/92100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/92100.html</trackback:ping><description><![CDATA[
<p><!--开始头部--> <!--结束头部--><!--开始中部--></p>
<table cellpadding="3" width="100%" align="center" cellspacing="0" border="0">
<tbody>
<tr width="100%">
<td width="1%"/>
<!--开始正文-->
<td width="98%">
<center>
<h4>Java语言编码规范(Java Code Conventions)</h4>
<table><!--目录-->
<tbody>
<tr colspan="3" align="left">
<td width="10%"/>
<td valign="top">
<table cellpadding="5" width="100%" border="1" class="middletext">
<tbody>
<tr>
<td width="60">　<strong>名称</strong></td>
<td>Java语言编码规范(Java Code Conventions)</td>
</tr>
<tr>
<td>　<strong>译者</strong></td>
<td>晨光（Morning）</td>
</tr>
<tr>
<td>　<strong>简介</strong></td>
<td>本文档讲述了Java语言的编码规范，较之陈世忠先生《c++编码规范》的浩繁详尽，此文当属短小精悍了。而其中所列之各项条款，从编码风格，到注意事项，不单只Java，对于其他语言，也都很有借鉴意义。因为简短，所以易记，大家不妨将此作为handbook，常备案头，逐一对验。</td>
</tr>
<tr>
<td>　<strong>声明</strong></td>
<td>如需复制、传播，请附上本声明，谢谢。<br/>原文出处：http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html，<br/>译文出处：http://morningspace.51.net/，moyingzz@etang.com</td>
</tr>
<tr>
<td colspan="2">
<p>　<strong>目录</strong></p>
<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#1">1 介绍</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#11">1.1 为什么要有编码规范</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#12">1.2 版权声明</a></li>
</ul>
<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#2">2 文件名</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#21">2.1 文件后缀</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#22">2.2 常用文件名</a></li>
</ul>
<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#3">3 文件组织</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#31">3.1 Java源文件</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#311">3.1.1 开头注释</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#312">3.1.2 包和引入语句</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#313">3.1.3 类和接口声明</a></li>
</ul>
</li>
</ul>
<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#4">4 缩进排版</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#41">4.1 行长度</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#42">4.2 换行</a></li>
</ul>
<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#5">5 注释</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#51">5.1 实现注释的格式</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#511">5.1.1 块注释</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#512">5.1.2 单行注释</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#513">5.1.3 尾端注释</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#514">5.1.4 行末注释</a></li>
</ul>
</li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#52">5.2 文挡注释</a></li>
</ul>
<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#6">6 声明</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#61">6.1 每行声明变量的数量</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#62">6.2 初始化</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#63">6.3 布局</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#64">6.4 类和接口的声明</a></li>
</ul>
<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#7">7 语句</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#71">7.1 简单语句</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#72">7.2 复合语句</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#73">7.3 返回语句</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#74">7.4 if，if-else，if else-if else语句</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#75">7.5 for语句</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#76">7.6 while语句</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#77">7.7 do-while语句</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#78">7.8 switch语句</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#79">7.9 try-catch语句</a></li>
</ul>
<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#8">8 空白</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#81">8.1 空行</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#82">8.2 空格</a></li>
</ul>
<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#9">9 命名规范</a> <a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#a">10 编程惯例</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#a1">10.1 提供对实例以及类变量的访问控制</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#a2">10.2 引用类变量和类方法</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#a3">10.3 常量</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#a4">10.4 变量赋值</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#a5">10.5 其它惯例</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#a51">10.5.1 圆括号</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#a52">10.5.2 返回值</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#a53">10.5.3 条件运算符"?"前的表达式"?"前的表达式</a></li>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#a54">10.5.4 特殊注释</a></li>
</ul>
</li>
</ul>
<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#b">11 代码范例</a>
<ul>
<li><a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#b1">11.1 Java源文件范例</a></li>
</ul>
</td>
</tr>
</tbody>
</table>
</td>
<td width="10%"/>
</tr>
<!--内容-->
<tr colspan="3" align="left">
<td width="10%"/>
<td valign="top">
<p class="middletitle"><a name="1">1 介绍(Introduction)</a></p>
<p class="middletitle"><a name="11">1.1 为什么要有编码规范(Why Have Code Conventions)</a></p>
<p>编码规范对于程序员而言尤为重要，有以下几个原因：</p>
<p>- 一个软件的生命周期中，80%的花费在于维护<br/>- 几乎没有任何一个软件，在其整个生命周期中，均由最初的开发人员来维护<br/>- 编码规范可以改善软件的可读性，可以让程序员尽快而彻底地理解新的代码<br/>- 如果你将源码作为产品发布，就需要确任它是否被很好的打包并且清晰无误，一如你已构建的其它任何产品</p>
<p>为了执行规范，每个软件开发人员必须一致遵守编码规范。每个人。</p>
<p class="middletitle"><a name="12">1.2 版权声明(Acknowledgments)</a></p>
<p>本文档反映的是Sun MicroSystems公司，Java语言规范中的编码标准部分。主要贡献者包括：Peter King，Patrick Naughton，Mike DeMoney，Jonni Kanerva，Kathy Walrath以及Scott Hommel。</p>
<p>本文档现由Scott Hommel维护，有关评论意见请发至shommel@eng.sun.com</p>
<p class="middletitle"><a name="2">2 文件名(File Names)</a></p>
<p>这部分列出了常用的文件名及其后缀。</p>
<p class="middletitle"><a name="21">2.1 文件后缀(File Suffixes)</a></p>
<p>Java程序使用下列文件后缀：</p>
<table border="1">
<tbody>
<tr>
<td>文件类别</td>
<td>文件后缀</td>
</tr>
<tr>
<td>Java源文件</td>
<td>.java</td>
</tr>
<tr>
<td>Java字节码文件</td>
<td>.class</td>
</tr>
</tbody>
</table>
<p class="middletitle"><a name="22">2.2 常用文件名(Common File Names)</a></p>
<p>常用的文件名包括：</p>
<table border="1">
<tbody>
<tr>
<td>文件名</td>
<td>用途</td>
</tr>
<tr>
<td>GNUmakefile</td>
<td>makefiles的首选文件名。我们采用gnumake来创建（build）软件。</td>
</tr>
<tr>
<td>README</td>
<td>概述特定目录下所含内容的文件的首选文件名</td>
</tr>
</tbody>
</table>
<p class="middletitle"><a name="3">3 文件组织(File Organization)</a></p>
<p>一个文件由被空行分割而成的段落以及标识每个段落的可选注释共同组成。超过2000行的程序难以阅读，应该尽量避免。"Java源文件范例"提供了一个布局合理的Java程序范例。</p>
<p class="middletitle"><a name="31">3.1 Java源文件(Java Source Files)</a></p>
<p>每个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个公共类相关联，可以将它们和公共类放入同一个源文件。公共类必须是这个文件中的第一个类或接口。</p>
<p>Java源文件还遵循以下规则：</p>
<p>- 开头注释（参见"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#311">开头注释</a>"）<br/>- 包和引入语句（参见"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#312">包和引入语句</a>"）<br/>- 类和接口声明（参见"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#313">类和接口声明</a>"）</p>
<p class="middletitle"><a name="311">3.1.1 开头注释(Beginning Comments)</a></p>
<p>所有的源文件都应该在开头有一个C语言风格的注释，其中列出类名、版本信息、日期和版权声明：</p>
<br/><pre xml:space="preserve">
  /*
   * Classname
   *
   * Version information
   *
   * Date
   *
   * Copyright notice
   */
          
</pre>
<br/><p class="middletitle"><a name="312">3.1.2 包和引入语句(Package and Import Statements)</a></p>
<p>在多数Java源文件中，第一个非注释行是包语句。在它之后可以跟引入语句。例如：</p>
<br/><pre xml:space="preserve">
  package java.awt;

  import java.awt.peer.CanvasPeer;
          
</pre>
<br/><p class="middletitle"><a name="313">3.1.3 类和接口声明(Class and Interface Declarations)</a></p>
<p>下表描述了类和接口声明的各个部分以及它们出现的先后次序。参见"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#b1">Java源文件范例</a>"中一个包含注释的例子。</p>
<table border="1">
<tbody>
<tr>
<td/>
<td>类/接口声明的各部分</td>
<td>注解</td>
</tr>
<tr>
<td>1</td>
<td>类/接口文档注释(/**……*/)</td>
<td>该注释中所需包含的信息，参见"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#52">文档注释</a>"</td>
</tr>
<tr>
<td>2</td>
<td>类或接口的声明</td>
<td/>
</tr>
<tr>
<td>3</td>
<td>类/接口实现的注释(/*……*/)如果有必要的话</td>
<td>该注释应包含任何有关整个类或接口的信息，而这些信息又不适合作为类/接口文档注释。</td>
</tr>
<tr>
<td>4</td>
<td>类的(静态)变量</td>
<td>首先是类的公共变量，随后是保护变量，再后是包一级别的变量(没有访问修饰符，access modifier)，最后是私有变量。</td>
</tr>
<tr>
<td>5</td>
<td>实例变量</td>
<td>首先是公共级别的，随后是保护级别的，再后是包一级别的(没有访问修饰符)，最后是私有级别的。</td>
</tr>
<tr>
<td>6</td>
<td>构造器</td>
<td/>
</tr>
<tr>
<td>7</td>
<td>方法</td>
<td>这些方法应该按功能，而非作用域或访问权限，分组。例如，一个私有的类方法可以置于两个公有的实例方法之间。其目的是为了更便于阅读和理解代码。</td>
</tr>
</tbody>
</table>
<p class="middletitle"><a name="4">4 缩进排版(Indentation)</a></p>
<p>4个空格常被作为缩进排版的一个单位。缩进的确切解释并未详细指定(空格 vs. 制表符)。一个制表符等于8个空格(而非4个)。</p>
<p class="middletitle"><a name="41">4.1 行长度(Line Length)</a></p>
<p>尽量避免一行的长度超过80个字符，因为很多终端和工具不能很好处理之。</p>
<p>注意：用于文档中的例子应该使用更短的行长，长度一般不超过70个字符。</p>
<p class="middletitle"><a name="42">4.2 换行(Wrapping Lines)</a></p>
<p>当一个表达式无法容纳在一行内时，可以依据如下一般规则断开之：</p>
<p>- 在一个逗号后面断开<br/>- 在一个操作符前面断开<br/>- 宁可选择较高级别(higher-level)的断开，而非较低级别(lower-level)的断开<br/>- 新的一行应该与上一行同一级别表达式的开头处对齐<br/>- 如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边，那就代之以缩进8个空格。</p>
<p>以下是断开方法调用的一些例子：</p>
<br/><pre xml:space="preserve">
  someMethod(longExpression1, longExpression2, longExpression3, 
                   longExpression4, longExpression5);

  var = someMethod1(longExpression1, 
                            someMethod2(longExpression2, 
                                               longExpression3));
          
</pre>
<br/><p>以下是两个断开算术表达式的例子。前者更好，因为断开处位于括号表达式的外边，这是个较高级别的断开。</p>
<br/><pre xml:space="preserve">
  longName1 = longName2 * (longName3 + longName4 - longName5)
                     + 4 * longname6; //PREFFER

  longName1 = longName2 * (longName3 + longName4 
                                         - longName5) + 4 * longname6; //AVOID
          
</pre>
<br/><p>以下是两个缩进方法声明的例子。前者是常规情形。后者若使用常规的缩进方式将会使第二行和第三行移得很靠右，所以代之以缩进8个空格</p>
<br/><pre xml:space="preserve">
  //CONVENTIONAL INDENTATION
  someMethod(int anArg, Object anotherArg, String yetAnotherArg, 
                    Object andStillAnother) {
    ...
  }

  //INDENT 8 SPACES TO AVOID VERY DEEP INDENTS
  private static synchronized horkingLongMethodName(int anArg,
          Object anotherArg, String yetAnotherArg,
          Object andStillAnother) {
    ...
  }
          
</pre>
<br/><p>if语句的换行通常使用8个空格的规则，因为常规缩进(4个空格)会使语句体看起来比较费劲。比如：</p>
<br/><pre xml:space="preserve">
  //DON'T USE THIS INDENTATION
  if ((condition1 &amp;&amp; condition2)
      || (condition3 &amp;&amp; condition4)
      ||!(condition5 &amp;&amp; condition6)) { //BAD WRAPS
      doSomethingAboutIt();             //MAKE THIS LINE EASY TO MISS
  }

  //USE THIS INDENTATION INSTEAD
  if ((condition1 &amp;&amp; condition2)
          || (condition3 &amp;&amp; condition4)
          ||!(condition5 &amp;&amp; condition6)) {
      doSomethingAboutIt();
  }

  //OR USE THIS
  if ((condition1 &amp;&amp; condition2) || (condition3 &amp;&amp; condition4)
          ||!(condition5 &amp;&amp; condition6)) {
      doSomethingAboutIt();
  }
          
</pre>
<br/><p>这里有三种可行的方法用于处理三元运算表达式：</p>
<br/><pre xml:space="preserve">
  alpha = (aLongBooleanExpression) ? beta : gamma;

  alpha = (aLongBooleanExpression) ? beta
                                   : gamma;

  alpha = (aLongBooleanExpression)
          ? beta
          : gamma;
          
</pre>
<br/><p class="middletitle"><a name="5">5 注释(Comments)</a></p>
<p>Java程序有两类注释：实现注释(implementation comments)和文档注释(document comments)。实现注释是那些在C++中见过的，使用/*...*/和//界定的注释。文档注释(被称为"doc comments")是Java独有的，并由/**...*/界定。文档注释可以通过javadoc工具转换成HTML文件。</p>
<p>实现注释用以注释代码或者实现细节。文档注释从实现自由(implementation-free)的角度描述代码的规范。它可以被那些手头没有源码的开发人员读懂。</p>
<p>注释应被用来给出代码的总括，并提供代码自身没有提供的附加信息。注释应该仅包含与阅读和理解程序有关的信息。例如，相应的包如何被建立或位于哪个目录下之类的信息不应包括在注释中。</p>
<p>在注释里，对设计决策中重要的或者不是显而易见的地方进行说明是可以的，但应避免提供代码中己清晰表达出来的重复信息。多余的的注释很容易过时。通常应避免那些代码更新就可能过时的注释。</p>
<p>注意：频繁的注释有时反映出代码的低质量。当你觉得被迫要加注释的时候，考虑一下重写代码使其更清晰。</p>
<p>注释不应写在用星号或其他字符画出来的大框里。注释不应包括诸如制表符和回退符之类的特殊字符。</p>
<p class="middletitle"><a name="51">5.1 实现注释的格式(Implementation Comment Formats)</a></p>
<p>程序可以有4种实现注释的风格：块(block)、单行(single-line)、尾端(trailing)和行末(end-of-line)。</p>
<p class="middletitle"><a name="511">5.1.1 块注释(Block Comments)</a></p>
<p>块注释通常用于提供对文件，方法，数据结构和算法的描述。块注释被置于每个文件的开始处以及每个方法之前。它们也可以被用于其他地方，比如方法内部。在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式。</p>
<p>块注释之首应该有一个空行，用于把块注释和代码分割开来，比如：</p>
<br/><pre xml:space="preserve">
  /*
   * Here is a block comment.
   */
          
</pre>
<br/><p>块注释可以以/*-开头，这样indent(1)就可以将之识别为一个代码块的开始，而不会重排它。</p>
<br/><pre xml:space="preserve">
  /*-
    * Here is a block comment with some very special
    * formatting that I want indent(1) to ignore.
    *
    *    one
    *        two
    *            three
    */
          
</pre>
<br/><p>注意：如果你不使用indent(1)，就不必在代码中使用/*-，或为他人可能对你的代码运行indent(1)作让步。</p>
<p>参见"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#52">文档注释</a>"</p>
<p class="middletitle"><a name="512">5.1.2 单行注释(Single-Line Comments)</a></p>
<p>短注释可以显示在一行内，并与其后的代码具有一样的缩进层级。如果一个注释不能在一行内写完，就该采用块注释(参见"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#511">块注释</a>")。单行注释之前应该有一个空行。以下是一个Java代码中单行注释的例子：</p>
<br/><pre xml:space="preserve">
  if (condition) {

    /* Handle the condition. */
    ...
  }
          
</pre>
<br/><p class="middletitle"><a name="513">5.1.3 尾端注释(Trailing Comments)</a></p>
<p>极短的注释可以与它们所要描述的代码位于同一行，但是应该有足够的空白来分开代码和注释。若有多个短注释出现于大段代码中，它们应该具有相同的缩进。</p>
<p>以下是一个Java代码中尾端注释的例子：</p>
<br/><pre xml:space="preserve">
  if (a == 2) {
      return TRUE;              /* special case */
  } else {
      return isPrime(a);         /* works only for odd a */
  }
          
</pre>
<br/><p class="middletitle"><a name="514">5.1.4 行末注释(End-Of-Line Comments)</a></p>
<p>注释界定符"//"，可以注释掉整行或者一行中的一部分。它一般不用于连续多行的注释文本；然而，它可以用来注释掉连续多行的代码段。以下是所有三种风格的例子：</p>
<br/><pre xml:space="preserve">
  if (foo &gt; 1) {

      // Do a double-flip.
      ...
  }
  else {
      return false;          // Explain why here.
  }

  //if (bar &gt; 1) {
  //
  //    // Do a triple-flip.
  //    ...
  //}
  //else {
  //    return false;
  //}
          
</pre>
<br/><p class="middletitle"><a name="52">5.2 文档注释(Documentation Comments)</a></p>
<p>注意：此处描述的注释格式之范例，参见"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#b1">Java源文件范例</a>"</p>
<p>若想了解更多，参见"How to Write Doc Comments for Javadoc"，其中包含了有关文档注释标记的信息(@return, @param, @see)：</p>
<p><a href="http://java.sun.com/javadoc/writingdoccomments/index.html">http://java.sun.com/javadoc/writingdoccomments/index.html</a></p>
<p>若想了解更多有关文档注释和javadoc的详细资料，参见javadoc的主页：</p>
<p><a href="http://java.sun.com/javadoc/index.html">http://java.sun.com/javadoc/index.html</a></p>
<p>文档注释描述Java的类、接口、构造器，方法，以及字段(field)。每个文档注释都会被置于注释定界符/**...*/之中，一个注释对应一个类、接口或成员。该注释应位于声明之前：</p>
<br/><pre xml:space="preserve">
  /**
    * The Example class provides ...
    */
  public class Example { ...
          
</pre>
<br/><p>注意顶层(top-level)的类和接口是不缩进的，而其成员是缩进的。描述类和接口的文档注释的第一行(/**)不需缩进；随后的文档注释每行都缩进1格(使星号纵向对齐)。成员，包括构造函数在内，其文档注释的第一行缩进4格，随后每行都缩进5格。</p>
<p>若你想给出有关类、接口、变量或方法的信息，而这些信息又不适合写在文档中，则可使用实现块注释(见5.1.1)或紧跟在声明后面的单行注释(见5.1.2)。例如，有关一个类实现的细节，应放入紧跟在类声明后面的实现块注释中，而不是放在文档注释中。</p>
<p>文档注释不能放在一个方法或构造器的定义块中，因为Java会将位于文档注释之后的第一个声明与其相关联。</p>
<p class="middletitle"><a name="6">6 声明(Declarations)</a></p>
<p class="middletitle"><a name="61">6.1 每行声明变量的数量(Number Per Line)</a></p>
<p>推荐一行一个声明，因为这样以利于写注释。亦即，</p>
<br/><pre xml:space="preserve">
  int level;  // indentation level
  int size;   // size of table
          
</pre>
<br/><p>要优于，</p>
<p>int level, size;</p>
<p>不要将不同类型变量的声明放在同一行，例如：</p>
<br/><pre xml:space="preserve">
  int foo,  fooarray[];   //WRONG!
          
</pre>
<br/><p>注意：上面的例子中，在类型和标识符之间放了一个空格，另一种被允许的替代方式是使用制表符：</p>
<br/><pre xml:space="preserve">
  int               level;         // indentation level
  int           size;          // size of table
  Object        currentEntry;  // currently selected table entry
          
</pre>
<br/><p class="middletitle"><a name="62">6.2 初始化(Initialization)</a></p>
<p>尽量在声明局部变量的同时初始化。唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。</p>
<p class="middletitle"><a name="63">6.3 布局(Placement)</a></p>
<p>只在代码块的开始处声明变量。（一个块是指任何被包含在大括号"{"和"}"中间的代码。）不要在首次用到该变量时才声明之。这会把注意力不集中的程序员搞糊涂，同时会妨碍代码在该作用域内的可移植性。</p>
<br/><pre xml:space="preserve">
  void myMethod() {
      int int1 = 0;         // beginning of method block

      if (condition) {
          int int2 = 0;     // beginning of "if" block
          ...
      }
  }
          
</pre>
<br/><p>该规则的一个例外是for循环的索引变量</p>
<br/><pre xml:space="preserve">
  for (int i = 0; i &lt; maxLoops; i++) { ... }
          
</pre>
<br/><p>避免声明的局部变量覆盖上一级声明的变量。例如，不要在内部代码块中声明相同的变量名：</p>
<br/><pre xml:space="preserve">
  int count;
  ...
  myMethod() {
      if (condition) {
          int count = 0;     // AVOID!
          ...
      }
      ...
  }
          
</pre>
<br/><p class="middletitle"><a name="64">6.4 类和接口的声明(Class and Interface Declarations)</a></p>
<p>当编写类和接口是，应该遵守以下格式规则：</p>
<p>- 在方法名与其参数列表之前的左括号"("间不要有空格<br/>- 左大括号"{"位于声明语句同行的末尾<br/>- 右大括号"}"另起一行，与相应的声明语句对齐，除非是一个空语句，"}"应紧跟在"{"之后</p>
<pre xml:space="preserve">
  class Sample extends Object {
      int ivar1;
      int ivar2;

      Sample(int i, int j) {
          ivar1 = i;
          ivar2 = j;
      }

      int emptyMethod() {}

      ...
  }
          
</pre>
- 方法与方法之间以空行分隔<br/><p class="middletitle"><a name="7">7 语句(Statements)</a></p>
<p class="middletitle"><a name="71">7.1 简单语句(Simple Statements)</a></p>
<p>每行至多包含一条语句，例如：</p>
<br/><pre xml:space="preserve">
  argv++;       // Correct
  argc--;       // Correct
  argv++; argc--;       // AVOID!
          
</pre>
<br/><p class="middletitle"><a name="72">7.2 复合语句(Compound Statements)</a></p>
<p>复合语句是包含在大括号中的语句序列，形如"{ 语句 }"。例如下面各段。</p>
<p>- 被括其中的语句应该较之复合语句缩进一个层次<br/>- 左大括号"{"应位于复合语句起始行的行尾；右大括号"}"应另起一行并与复合语句首行对齐。<br/>- 大括号可以被用于所有语句，包括单个语句，只要这些语句是诸如if-else或for控制结构的一部分。这样便于添加语句而无需担心由于忘了加括号而引入bug。</p>
<p class="middletitle"><a name="73">7.3 返回语句(return Statements)</a></p>
<p>一个带返回值的return语句不使用小括号"()"，除非它们以某种方式使返回值更为显见。例如：</p>
<br/><pre xml:space="preserve">
  return;

  return myDisk.size();

  return (size ? size : defaultSize);
          
</pre>
<br/><p class="middletitle"><a name="74">7.4 if，if-else，if else-if else语句(if, if-else, if else-if else Statements)</a></p>
<p>if-else语句应该具有如下格式：</p>
<br/><pre xml:space="preserve">
  if (condition) {
      statements;
  }

  if (condition) {
      statements;
  } else {
      statements;
  }

  if (condition) {
      statements;
  } else if (condition) {
      statements;
  } else{
      statements;
  }
          
</pre>
<br/><p>注意：if语句总是用"{"和"}"括起来，避免使用如下容易引起错误的格式：</p>
<br/><pre xml:space="preserve">
  if (condition) //AVOID! THIS OMITS THE BRACES {}!
      statement;
          
</pre>
<br/><p class="middletitle"><a name="75">7.5 for语句(for Statements)</a></p>
<p>一个for语句应该具有如下格式：</p>
<br/><pre xml:space="preserve">
  for (initialization; condition; update) {
      statements;
  }
          
</pre>
<br/><p>一个空的for语句(所有工作都在初始化，条件判断，更新子句中完成）应该具有如下格式：</p>
<br/><pre xml:space="preserve">
  for (initialization; condition; update);
          
</pre>
<br/><p>当在for语句的初始化或更新子句中使用逗号时，避免因使用三个以上变量，而导致复杂度提高。若需要，可以在for循环之前(为初始化子句)或for循环末尾(为更新子句)使用单独的语句。</p>
<p class="middletitle"><a name="76">7.6 while语句(while Statements)</a></p>
<p>一个while语句应该具有如下格式</p>
<br/><pre xml:space="preserve">
  while (condition) {
      statements;
  }
          
</pre>
<br/><p>一个空的while语句应该具有如下格式：</p>
<br/><pre xml:space="preserve">
  while (condition);
          
</pre>
<br/><p class="middletitle"><a name="77">7.7 do-while语句(do-while Statements)</a></p>
<p>一个do-while语句应该具有如下格式：</p>
<br/><pre xml:space="preserve">
  do {
      statements;
  } while (condition);
          
</pre>
<br/><p class="middletitle"><a name="78">7.8 switch语句(switch Statements)</a></p>
<p>一个switch语句应该具有如下格式：</p>
<br/><pre xml:space="preserve">
  switch (condition) {
  case ABC:
      statements;
      /* falls through */
  case DEF:
      statements;
      break;

  case XYZ:
      statements;
      break;

  default:
      statements;
      break;
  }
          
</pre>
<br/><p>每当一个case顺着往下执行时(因为没有break语句)，通常应在break语句的位置添加注释。上面的示例代码中就包含注释/* falls through */。</p>
<p class="middletitle"><a name="79">7.9 try-catch语句(try-catch Statements)</a></p>
<p>一个try-catch语句应该具有如下格式：</p>
<br/><pre xml:space="preserve">
  try {
      statements;
  } catch (ExceptionClass e) {
      statements;
  }
          
</pre>
<br/><p>一个try-catch语句后面也可能跟着一个finally语句，不论try代码块是否顺利执行完，它都会被执行。</p>
<br/><pre xml:space="preserve">
  try {
      statements;
  } catch (ExceptionClass e) {
      statements;
  } finally {
      statements;
  }
          
</pre>
<br/><p class="middletitle"><a name="8">8 空白(White Space)</a></p>
<p class="middletitle"><a name="81">8.1 空行(Blank Lines)</a></p>
<p>空行将逻辑相关的代码段分隔开，以提高可读性。</p>
<p>下列情况应该总是使用两个空行：</p>
<p>- 一个源文件的两个片段(section)之间<br/>- 类声明和接口声明之间</p>
<p>下列情况应该总是使用一个空行：</p>
<p>- 两个方法之间<br/>- 方法内的局部变量和方法的第一条语句之间<br/>- 块注释（参见"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#511">5.1.1</a>"）或单行注释（参见"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#512">5.1.2</a>"）之前<br/>- 一个方法内的两个逻辑段之间，用以提高可读性</p>
<p class="middletitle"><a name="82">8.2 空格(Blank Spaces)</a></p>
<p>下列情况应该使用空格：</p>
<p>- 一个紧跟着括号的关键字应该被空格分开，例如：<br/></p>
<pre xml:space="preserve">
  while (true) {
      ...
  }
          
</pre>
注意：空格不应该置于方法名与其左括号之间。这将有助于区分关键字和方法调用。<br/>- 空白应该位于参数列表中逗号的后面<br/>- 所有的二元运算符，除了"."，应该使用空格将之与操作数分开。一元操作符和操作数之间不因该加空格，比如：负号("-")、自增("++")和自减("--")。例如：
<pre xml:space="preserve">
    a += c + d;
    a = (a + b) / (c * d);

    while (d++ = s++) {
        n++;
    }
    printSize("size is " + foo + "\n");
          
</pre>
- for语句中的表达式应该被空格分开，例如：
<pre xml:space="preserve">
    for (expr1; expr2; expr3)
          
</pre>
- 强制转型后应该跟一个空格，例如：
<pre xml:space="preserve">
    myMethod((byte) aNum, (Object) x);
    myMethod((int) (cp + 5), ((int) (i + 3)) + 1);
          
</pre>
<br/><p class="middletitle"><a name="9">9 命名规范(Naming Conventions)</a></p>
<p>命名规范使程序更易读，从而更易于理解。它们也可以提供一些有关标识符功能的信息，以助于理解代码，例如，不论它是一个常量，包，还是类。</p>
<table border="1">
<tbody>
<tr>
<td>标识符类型</td>
<td>命名规则</td>
<td>例子</td>
</tr>
<tr>
<td>包(Packages)</td>
<td>一个唯一包名的前缀总是全部小写的ASCII字母并且是一个顶级域名，通常是com，edu，gov，mil，net，org，或1981年ISO 3166标准所指定的标识国家的英文双字符代码。包名的后续部分根据不同机构各自内部的命名规范而不尽相同。这类命名规范可能以特定目录名的组成来区分部门(department)，项目(project)，机器(machine)，或注册名(login names)。</td>
<td>com.sun.eng<br/>com.apple.quicktime.v2<br/>edu.cmu.cs.bovik.cheese</td>
</tr>
<tr>
<td>类(Classes)</td>
<td>命名规则：类名是个一名词，采用大小写混合的方式，每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词，避免缩写词(除非该缩写词被更广泛使用，像URL，HTML)</td>
<td>class Raster;<br/>class ImageSprite;</td>
</tr>
<tr>
<td>接口(Interfaces)</td>
<td>命名规则：大小写规则与类名相似</td>
<td>interface RasterDelegate;<br/>interface Storing;</td>
</tr>
<tr>
<td>方法(Methods)</td>
<td>方法名是一个动词，采用大小写混合的方式，第一个单词的首字母小写，其后单词的首字母大写。</td>
<td>run();<br/>runFast();<br/>getBackground();</td>
</tr>
<tr>
<td>变量(Variables)</td>
<td>除了变量名外，所有实例，包括类，类常量，均采用大小写混合的方式，第一个单词的首字母小写，其后单词的首字母大写。变量名不应以下划线或美元符号开头，尽管这在语法上是允许的。<br/>变量名应简短且富于描述。变量名的选用应该易于记忆，即，能够指出其用途。尽量避免单个字符的变量名，除非是一次性的临时变量。临时变量通常被取名为i，j，k，m和n，它们一般用于整型；c，d，e，它们一般用于字符型。</td>
<td>char c;<br/>int i;<br/>float myWidth;</td>
</tr>
<tr>
<td>实例变量(Instance Variables)</td>
<td>大小写规则和变量名相似，除了前面需要一个下划线</td>
<td>int _employeeId;<br/>String _name;<br/>Customer _customer;</td>
</tr>
<tr>
<td>常量(Constants)</td>
<td>类常量和ANSI常量的声明，应该全部大写，单词间用下划线隔开。(尽量避免ANSI常量，容易引起错误)</td>
<td>static final int MIN_WIDTH = 4;<br/>static final int MAX_WIDTH = 999;<br/>static final int GET_THE_CPU = 1;</td>
</tr>
</tbody>
</table>
<p class="middletitle"><a name="a" id="a">10 编程惯例(Programming Practices)</a></p>
<p class="middletitle"><a name="a1" id="a1">10.1 提供对实例以及类变量的访问控制(Providing Access to Instance and Class Variables)</a></p>
<p>若没有足够理由，不要把实例或类变量声明为公有。通常，实例变量无需显式的设置(set)和获取(gotten)，通常这作为方法调用的边缘效应 (side effect)而产生。</p>
<p>一个具有公有实例变量的恰当例子，是类仅作为数据结构，没有行为。亦即，若你要使用一个结构(struct)而非一个类(如果java支持结构的话)，那么把类的实例变量声明为公有是合适的。</p>
<p class="middletitle"><a name="a2" id="a2">10.2 引用类变量和类方法(Referring to Class Variables and Methods)</a></p>
<p>避免用一个对象访问一个类的静态变量和方法。应该用类名替代。例如：</p>
<br/><pre xml:space="preserve">
  classMethod();             //OK
  AClass.classMethod();      //OK
  anObject.classMethod();    //AVOID!
          
</pre>
<br/><p class="middletitle"><a name="a3" id="a3">10.3 常量(Constants)</a></p>
<p>位于for循环中作为计数器值的数字常量，除了-1,0和1之外，不应被直接写入代码。</p>
<p class="middletitle"><a name="a4" id="a4">10.4 变量赋值(Variable Assignments)</a></p>
<p>避免在一个语句中给多个变量赋相同的值。它很难读懂。例如：</p>
<br/><pre xml:space="preserve">
  fooBar.fChar = barFoo.lchar = 'c'; // AVOID!
          
</pre>
<br/><p>不要将赋值运算符用在容易与相等关系运算符混淆的地方。例如：</p>
<br/><pre xml:space="preserve">
  if (c++ = d++) {        // AVOID! (Java disallows)
      ...
  }
          
</pre>
<br/><p>应该写成</p>
<br/><pre xml:space="preserve">
  if ((c++ = d++) != 0) {
    ...
  }
          
</pre>
<br/><p>不要使用内嵌(embedded)赋值运算符试图提高运行时的效率，这是编译器的工作。例如：</p>
<br/><pre xml:space="preserve">
  d = (a = b + c) + r;        // AVOID!
          
</pre>
<br/><p>应该写成</p>
<br/><pre xml:space="preserve">
  a = b + c;
  d = a + r;
          
</pre>
<br/><p class="middletitle"><a name="a5" id="a5">10.5 其它惯例(Miscellaneous Practices)</a></p>
<p class="middletitle"><a name="a51" id="a51">10.5.1 圆括号(Parentheses)</a></p>
<p>一般而言，在含有多种运算符的表达式中使用圆括号来避免运算符优先级问题，是个好方法。即使运算符的优先级对你而言可能很清楚，但对其他人未必如此。你不能假设别的程序员和你一样清楚运算符的优先级。</p>
<br/><pre xml:space="preserve">
  if (a == b &amp;&amp; c == d)     // AVOID!
  if ((a == b) &amp;&amp; (c == d))  // RIGHT
          
</pre>
<br/><p class="middletitle"><a name="a52" id="a52">10.5.2 返回值(Returning Values)</a></p>
<p>设法让你的程序结构符合目的。例如：</p>
<br/><pre xml:space="preserve">
  if (booleanExpression) {
      return true;
  } else {
      return false;
  }
          
</pre>
<br/><p>应该代之以如下方法：</p>
<br/><pre xml:space="preserve">
  return booleanExpression;
          
</pre>
<br/><p>类似地：</p>
<br/><pre xml:space="preserve">
  if (condition) {
      return x;
  }
  return y;
          
</pre>
<br/><p>应该写做：</p>
<br/><pre xml:space="preserve">
  return (condition ? x : y);
          
</pre>
<br/><p class="middletitle"><a name="a53" id="a53">10.5.3 条件运算符"?"前的表达式(Expressions before '?' in the Conditional Operator)</a></p>
<p>如果一个包含二元运算符的表达式出现在三元运算符" ? : "的"?"之前，那么应该给表达式添上一对圆括号。例如：</p>
<br/><pre xml:space="preserve">
  (x &gt;= 0) ? x : -x;
          
</pre>
<br/><p class="middletitle"><a name="a54" id="a54">10.5.4 特殊注释(Special Comments)</a></p>
<p>在注释中使用XXX来标识某些未实现(bogus)的但可以工作(works)的内容。用FIXME来标识某些假的和错误的内容。</p>
<p class="middletitle"><a name="b" id="b">11 代码范例(Code Examples)</a></p>
<p class="middletitle"><a name="b1" id="b1">11.1 Java源文件范例(Java Source File Example)</a></p>
<p>下面的例子，展示了如何合理布局一个包含单一公共类的Java源程序。接口的布局与其相似。更多信息参见"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#313">类和接口声明</a>"以及"<a href="file:///D:/Documents%20and%20Settings/Administrator.JACKYLIU/Local%20Settings/Temp/CodeWeb/Java.mdb29.htm#52">文挡注释</a>"。</p>
<br/><pre xml:space="preserve">
/*
 * @(#)Blah.java        1.82 99/03/18
 *
 * Copyright (c) 1994-1999 Sun Microsystems, Inc.
 * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of Sun
 * Microsystems, Inc. ("Confidential Information").  You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Sun.
 */


package java.blah;

import java.blah.blahdy.BlahBlah;

/**
 * Class description goes here.
 *
 * @version     1.82 18 Mar 1999
 * @author      Firstname Lastname
 */
public class Blah extends SomeClass {
    /* A class implementation comment can go here. */

    /** classVar1 documentation comment */
    public static int classVar1;

    /**
     * classVar2 documentation comment that happens to be
     * more than one line long
     */
    private static Object classVar2;

    /** instanceVar1 documentation comment */
    public Object instanceVar1;

    /** instanceVar2 documentation comment */
    protected int instanceVar2;

    /** instanceVar3 documentation comment */
    private Object[] instanceVar3;

    /**
     * ...constructor Blah documentation comment...
     */
    public Blah() {
        // ...implementation goes here...
    }

    /**
     * ...method doSomething documentation comment...
     */
    public void doSomething() {
        // ...implementation goes here...
    }

    /**
     * ...method doSomethingElse documentation comment...
     * @param someParam description
     */
    public void doSomethingElse(Object someParam) {
        // ...implementation goes here...
    }
}
          
</pre>
<br/></td>
<td width="10%"/>
</tr>
</tbody>
</table>
<hr width="98%" noshade="noshade" size="1"/>
<!--开始底部-->
<table cellpadding="0" width="100%" align="center" cellspacing="0" border="0">
<tbody>
<tr>
<td align="middle"><span style="FONT-SIZE: 0.75em">Copyright? 2003,2004,2005,2006 Open Enterprise Foundation.<br/>Open Enterprise Foundation - Use open standard,open computer,open source construct stably enterprise infrastructure</span><br/></td>
</tr>
</tbody>
</table>
<!--结束底部--></center>
</td>
</tr>
</tbody>
</table>
<img src ="http://www.blogjava.net/beansoft/aggbug/92100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-01-05 20:19 <a href="http://www.blogjava.net/beansoft/archive/2007/01/05/92100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>金蝶 Jocky 混淆编译器(Eclipse)使用说明</title><link>http://www.blogjava.net/beansoft/archive/2006/12/29/90748.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Fri, 29 Dec 2006 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2006/12/29/90748.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/90748.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2006/12/29/90748.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/90748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/90748.html</trackback:ping><description><![CDATA[<p></p> <p>Jocky <a href="http://www.operamasks.org/ProjectDetails.jsp?proId=9c89b9f7010d1000e000007cca67bf51">http://www.operamasks.org/ProjectDetails.jsp?proId=9c89b9f7010d1000e000007cca67bf51</a> <p>Jocky是金蝶中间件技术领袖袁红岗先生的个人作品（旧有名称JOC)。原本是方便Apusic 应用服务器的开发，现在开放出来，供大家自由使用 ... Jocky提供了对IDE Eclipse的支持，同时，也支持在Ant中使用（事实上，在Eclipse中，也是先生成一个ant文件，然后再编译). <p>是挺好用, 编译后的代码大部分反编译出来只有 JVM 指令! 的确是保护系统核心的利器! 支持 JDK 1.5. 可是 Jocky 竟然不开源... 领袖啊! <p>以下是官方IDE(Apusic IDE)中的详细说明: <p>Jocky <p>Java Obfuscate Compiler Kit&nbsp;&nbsp;for You <h3>一、前言</h3> <h4><a>1.1 什么是Jocky?</a></h4>&nbsp;&nbsp;&nbsp;我们知道，Java是一种跨平台的编程语言，其源码(.java文件)被编译成与平台无关的字节码(.class文件)，然后在运行期动态链接。这样，编译后的类文件中将包含有符号表，从而使得Java程序很容易被反编译。相信每一个Java开发人员，都曾经用过诸如Jad之类的反编译器，对Java的class 文件进行反编译，从而观察程序的结构与实现细节。如此一来，对于那些需要严格进行知识产权保护的Java应用，如何有效的保护客户的商业投资，是开发人员经常需要面对的问题。<br>&nbsp;&nbsp;&nbsp;于是就出现了Java混淆编译器，它的作用是打乱class文件中的符号信息，从而使反向工程变得非常困难。<br>&nbsp;&nbsp;&nbsp;Jocky就是这样一款优秀的Java混淆编译器。  <h4><a>1.2 为什么需要Jocky?</a></h4>&nbsp;&nbsp;&nbsp;目前业界有不少商业的甚或是开源的混淆编译器，但它们普遍存在一些这样或者那样的问题。一般而言，现有的混淆器都是对编译好的 class文件进行混淆，这样就需要编译和混淆两个步骤。而事实上，并不是所有的符号都需要混淆。如果你开发的是一个类库，或者某些类需要动态装载，那些公共API(或者说:那些被publish出来的API)就必须保留符号不变，只有这样，别人才能使用你的类库。现有的混淆器提供了GUI或脚本的方式来对那些需要保留的符号名称进行配置，但如果程序较大时，配置工作将变得很复杂，而程序一旦修改，配置工作又要重新进行。某些混淆器能够调整字节码的顺序，使反编译更加困难，但笔者经历过混淆之后的程序运行出错的情况。<br>&nbsp;&nbsp;&nbsp;而Jocky与其它混淆编译器最大的不同之处在于:它是直接从源码上做文章，也就是说编译过程本身就是一个混淆过程。  <h4><a>1.3 Jocky是如何工作的?</a></h4>&nbsp;&nbsp;&nbsp;Jocky混淆编译器是在Sun JDK中提供的Java编译器(javac)的基础上完成的，修改了其中的代码生成过程，对编译器生成的中间代码进行混淆，最后再生成class文件，这样编译和混淆只需要一个步骤就可以完成。另外可以在源程序中插入 <a href="#2.4">符号保留指令</a> 来控制哪些符号需要保留，将混淆过程与开发过程融合在一起，不需要单独的配置。  <h4><a>1.4 Jocky的作用</a></h4> <h5><a>1.4.1代码混淆</a></h5>&nbsp;&nbsp;&nbsp;如前文所述，混淆编译是Jocky的首要用途。我们举一个最简单的例子，下面的SimpleBean是未经混淆的class文件通过Jad反编译以后获得的源文件:  <p><code><b>public&nbsp;class&nbsp;</b>SimpleBean&nbsp;<b>implements&nbsp;</b>Serializable&nbsp;{<br><b>private&nbsp;</b>String&nbsp;name&nbsp;=&nbsp;"myname";<br><b>private&nbsp;</b>List&nbsp;myList&nbsp;=&nbsp;<strong>null;</strong><br><b>&nbsp;&nbsp;public&nbsp;</b><b>void&nbsp;</b>SimpleBean()&nbsp;{<br>myList = <b>new&nbsp;</b>ArrayList(10);<br>}<br><b>&nbsp;&nbsp;public&nbsp;</b><b>void&nbsp;</b>foo1()&nbsp;{<br>myList.add("name");<br>}<br><b>private&nbsp;</b><b>void&nbsp;</b>foo2()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br>}<br><b>private&nbsp;</b><b>void&nbsp;</b>writeObject(java.io.ObjectOutputStream&nbsp;out)<br><b>throws&nbsp;</b>IOException&nbsp;{<br>}<br>}</code> <p>&lt;未混淆的类文件反编译后的效果&gt; <p>&nbsp;&nbsp;&nbsp;下面是经Jocky混淆过的类文件，通过Jad反编译后产生的源文件: <p><code><b>public&nbsp;class&nbsp;</b>SimpleBean&nbsp;<b>implements&nbsp;</b>Serializable&nbsp;{<br><b>private&nbsp;</b>String&nbsp;_$2;<br><b>private&nbsp;</b>List&nbsp;_$1;<br><b>&nbsp;&nbsp;public&nbsp;</b>SimpleBean() {<br>_$2&nbsp;=&nbsp;"myname";<br><b>this</b>;<br>JVM&nbsp;INSTR&nbsp;<b>new&nbsp;</b>#4&nbsp;&nbsp;&nbsp;&lt;Class&nbsp;ArrayList&gt;<br>JVM&nbsp;INSTR&nbsp;dup&nbsp;;<br>JVM&nbsp;INSTR&nbsp;swap&nbsp;;<br>10;<br>ArrayList();<br>_$1;<br>}&nbsp;&nbsp;<br><b>&nbsp;&nbsp;public&nbsp;</b><b>void&nbsp;</b>foo1()&nbsp;{<br>_$1.add("name");<br>}<br><b>private&nbsp;</b><b>void&nbsp;</b>_$1()&nbsp;{<br>}<br><b>private&nbsp;</b><b>void&nbsp;</b>writeObject(ObjectOutputStream&nbsp;objectoutputstream){<br><b>throws&nbsp;</b>IOException&nbsp;{<br>}<br>}</code> <p>&lt;Jocky混淆过的类文件反编译的效果&gt; <h5><a>1.4.2 支持将JDK 5.0的语法编译成能够在JDK 1.4上运行的类文件</a></h5>&nbsp;&nbsp;&nbsp;JDK 5.0在语法层面上有许多新增特色，能够为简化应用的开发带来一些便利。譬如Generics、Enhanced for Loop以及 Autoboxing/Unboxing等。但另人遗憾的是，倘若利用这些新的语法开发应用，就意味着不能够在JDK 1.4上运行，而JDK 1.4毕竟是目前最为普及的VM版本。幸运是，Jocky的另一个特色就是:通过参数配置，能够把用JDK 5.0语法编写的应用编译成JDK 1.4上的类文件版本。我们可以把经过 Jocky编译的类文件以UltraEdit打开，可以发现在第8个字节上(类文件的major version)的数值是0x30，即十进制的48，这是JDK 1.4所能够理解的类文件版本(JDK 5.0默认编译的类文件版本是49)。前提是:应用中不能够使用JDK 1.4中所没有的一些API。  <h3><a>二、Jocky的用法</a></h3> <h4><a>2.1 常规用法</a></h4>&nbsp;&nbsp;&nbsp;使用Jocky非常简单，获得jocky.jar以后，只需要运行java -jar jocky.jar就可以启动Jocky混淆编译器，jocky的命令行参数和javac完全相同，但增加了一个新的参数-scramble，它的用法如下： <pre>    -scramble          混淆所有package private或private符号
    -scrambleall       混淆所有符号
    -scramble:&lt;level&gt;  混淆相应级别的符号
     其中&lt;level&gt;指定混淆级别，可以是以下几种级别：
    -scramble:none        不进行混淆
    -scramble:private     对所有private访问级别的元素进行混淆
    -scramble:package     对所有private或package private元素进行混淆
    -scramble:protected   对所有private, package private, protected元素进行混淆
    -scramble:public      对所有的元素都进行混淆
    -scramble:all         相当于-scramble:public
    如果使用-scramble不带级别参数，则相当于-scramble:package
</pre>
<h4><a>2.2 Jocky for Ant</a></h4>&nbsp;&nbsp;&nbsp;&nbsp;近年来，Ant已经成为Java应用开发中打包工具的事实上的标准。在应用的开发过程中，我们往往都会有一个Ant脚本，通过该脚本，能够对应用进行编译、打包、发布等一系列过程。因此，Jocky的最佳切入点便是对Ant的支持。<br>&nbsp;&nbsp;&nbsp;&nbsp;在Ant中使用Jocky非常简单：<br>&nbsp;&nbsp;&nbsp;&nbsp;1. 将lib\jocky-ant.jar copy至ANT_HOME\lib目录下。<br>&nbsp;&nbsp;&nbsp;&nbsp;2. 在ant脚本中加入这样一行代码，以引入Jocky Task 
<p>&lt;taskdef resource="jockytasks/"&gt;
<p>&nbsp;&nbsp;&nbsp;&nbsp;3. 设置Jocky的一些基本属性，包括: jocky.jar包的位置，以及混淆级别，如下所示:
<p>&lt;jocky jar=" F:\Works2\Jocky\jocky1.0\lib\jocky.jar" enable="true" level="private/"&gt; 
<p>&nbsp;&nbsp;&nbsp;&nbsp;4. 当设置jocky的enable属性为true时，此时，Ant脚本中的javac编译命令，便会被自动替换成Jocky编译器；当设置enable属性为false时，javac编译命令将恢复成正常设置，示例脚本如下:
<p>&lt;project name="jocky" default="build"&gt;
<p>&lt;!-- 引入Jocky Ant Task，要确保jocky-ant.jar位于ANT_HOME\lib目录下 --&gt;
<p>&lt;taskdef resource="jockytasks"&gt; &lt;/taskdef&gt;
<p>&lt;target name="build"&gt;
<p>&lt;!-- 设置jocky.jar的位置以及混淆级别，当enable为true时，javac task将被自动替换成Jocky混淆编译器 --&gt;
<p>&lt;jocky jar=" F:\Works2\Jocky\jocky1.0\lib\jocky.jar" enable=" true" level=" private"&gt; &lt;/jocky&gt;
<p>&lt;!-- 下面的编译，将使用Jocky混淆编译器 --&gt;
<p>&lt;javac destdir="bin2" debug="on" source="1.5" target="1.4"&gt;
<p>&lt;src path="src"&gt;&lt;/src&gt;
<p>&lt;/javac&gt;
<p>&lt;!-- 当enable为false时，javac task将被恢复成正常设置, Jocky编译器不再起作用 --&gt;
<p>&lt;jocky enable="false"&gt;&lt;/jocky&gt;
<p>&lt;!-- 下面的编译，将使用正常的Javac编译器 --&gt;
<p>&lt;javac destdir="bin3" debug="on" target="1.4"&gt;
<p>&lt;src path="src"&gt;&lt;/src&gt;
<p>&lt;/javac&gt;
<p>&lt;/target&gt;
<p>&lt;/project&gt;
<p>&lt;Jocky的Ant脚本示例&gt;
<p>&nbsp;&nbsp;&nbsp;&nbsp;注意: Jocky for Ant在Ant 1.6.5上开发，推荐使用该版本。
<h4><a>2.3 Jocky for Eclipse<a></h4>&nbsp;&nbsp;&nbsp;&nbsp;Jocky提供了Eclipse的插件，从而能够直接在Eclipse中使用Jocky。<br>&nbsp;&nbsp;&nbsp;&nbsp;1. Jocky插件的安装：<br>&nbsp;&nbsp;&nbsp;&nbsp;将Jocky插件安装至Eclipse中非常简单，只需要将eclipse/plugins/org.apusic.jocky_1.0.0目录 copy 至 Eclipse的 plugins目录即可。或者在Eclipse/links文件夹中，通过link方式指定Jocky的插件目录。 <br>&nbsp;&nbsp;&nbsp;&nbsp;2. 在Eclipse中使用Jocky：<br>&nbsp;&nbsp;&nbsp;&nbsp;在Eclipse中使用Jocky也非常简单，任何一个Java工程，选中工程通过右键菜单，都可以出现Jocky的快捷菜单:
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JockyEclipse_D830/untitled%5B2%5D.png" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="687" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JockyEclipse_D830/untitled_thumb.png" width="536" border="0"></a> 
<p>&lt;Jocky在Eclipse中的右键菜单&gt;
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JockyEclipse_D830/untitled2%5B3%5D.png" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="360" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/JockyEclipse_D830/untitled2_thumb%5B1%5D.png" width="584" border="0"></a> 
<p>&lt;Jocky在Eclipse中的属性设置&gt;
<p>&nbsp;&nbsp;&nbsp;&nbsp;事实上，在Eclipse中使用Jocky时，Jocky也是首先针对所选工程生成Ant的Build文件（默认名称jocky_build.xml），然后再通过Ant完成混淆编译。 <br>&nbsp;&nbsp;&nbsp;&nbsp;以下是Jocky在Eclipse中自动生成的Ant Build 文件示例：
<p>&lt;project basedir="." default="build" name="jocky.example.jocky"&gt;
<p>&lt;property name="jocky.jar" value="f:\EclipseWTP1.0.8\workspace_jdk5_apusicstudio\org.apusic.jocky\jocky.jar"&gt;&lt;/property&gt;
<p>&lt;property name="jocky.output.dir" value="jocky"&gt;&lt;/property&gt;
<p>&lt;property name="jocky.scramble.level" value="package"&gt;&lt;/property&gt;
<p>&lt;property name="target" value="1.4"&gt;&lt;/property&gt;
<p>&lt;path id="project.classpath"&gt;
<p>&lt;pathelement location="bin"&gt;&lt;/pathelement&gt;
<p>&lt;/path&gt;
<p>&lt;target name="init"&gt;
<p>&lt;jocky jar="${jocky.jar}" level="${jocky.scramble.level}"&gt;&lt;/jocky&gt;
<p>&lt;mkdir dir="${jocky.output.dir}"&gt;&lt;/mkdir&gt;
<p>&lt;mkdir dir="${jocky.output.dir}/bin"&gt;&lt;/mkdir&gt;
<p>&lt;/target&gt;
<p>&lt;target name="clean"&gt;
<p>&lt;delete dir="${jocky.output.dir}/bin"&gt;&lt;/delete&gt;
<p>&lt;delete dir="${jocky.output.dir}"&gt;&lt;/delete&gt;
<p>&lt;/target&gt;
<p>&lt;target depends="init" name="build"&gt;
<p>&lt;echo message="${ant.project.name}: ${ant.file}"&gt;&lt;/echo&gt;
<p>&lt;jocky enable="true"&gt;&lt;/jocky&gt;
<p>&lt;javac destdir="${jocky.output.dir}/bin" target="${target}"&gt;
<p>&lt;src path="src"&gt;&lt;/src&gt;
<p>&lt;classpath refid="project.classpath"&gt;&lt;/classpath&gt;
<p>&lt;/javac&gt;
<p>&lt;/target&gt;
<p>&lt;/project&gt;
<p>&lt;Jocky在Eclipse中自动生成的Ant脚本示例&gt;
<p>注1：只支持Eclipse 3.1.1及以上版本。<br>注2：如果在Eclipse中找不到Jocky插件，请删除 Eclipse安装目录/configuration/org.eclipse.update 文件夹 (Maybe an eclipse bug?)。
<h4><a>2.4 如何使用符号保留指令</a></h4>&nbsp;&nbsp;&nbsp;除了在命令行用 -scramble 参数控制符号混淆级别外，还可以在源代码中使用符号保留指令来控制那些符号需要保留。符号保留指令是一个Java文档注释指令，可以插入在类和类成员的文档注释中，例如：
<p><code>/**<br>*&nbsp;This&nbsp;class&nbsp;should&nbsp;preserve.<br>*&nbsp;@preserve<br>*/<br><b>public&nbsp;class&nbsp;</b>Foo&nbsp;{<br>/**<br>*&nbsp;You&nbsp;can&nbsp;specify&nbsp;which&nbsp;field&nbsp;should&nbsp;be&nbsp;preserved.<br>*&nbsp;@preserve<br>*/<br><b>private&nbsp;</b><b>int&nbsp;</b>x;<br>/**<br>*&nbsp;This&nbsp;field&nbsp;is&nbsp;not&nbsp;preserved.<br>*/<br><b>private&nbsp;</b><b>int&nbsp;</b>y;<br>/**<br>*&nbsp;You&nbsp;can&nbsp;also&nbsp;preserve&nbsp;methods.<br>*&nbsp;@preserve<br>*/<br><b>public&nbsp;</b><b>void&nbsp;</b>hello()&nbsp;{}<br>/**<br>*&nbsp;This&nbsp;method&nbsp;is&nbsp;not&nbsp;preserved.<br>*/<br><b>private&nbsp;</b><b>void&nbsp;</b>collect()&nbsp;{}<br>}</code>
<p>&lt;使用preserved指令的示例&gt;
<p>&nbsp;&nbsp;&nbsp;如果没有@preserve指令，则根据混淆级别及成员的访问级别来确定符号是否保留。<br>&nbsp;&nbsp;&nbsp;对于类的符号保留指令可以附带一个保留级别参数，来控制类成员的符号保留，包括：<pre>       @preserve            仅对类名进行保留，类成员的保留根据-scramble命令行参数决定
       @preserve public     保留所有public成员
       @preserve protected  保留所有public和protected成员
       @preserve package    保留所有public, protected, package private成员
       @preserve private    保留所有成员
       @preserve all        相当于@preserve private
</pre>&nbsp;&nbsp;&nbsp;事实上，即便不加@preserve指令，Jocky对Java语言特有的一些private级别的方法不进行混淆，譬如，在序列化时有特殊作用的writeObject及readObject方法等。但笔者强烈建议: 针对这些有特殊含义不能够被混淆的 private级别的方法或者字段，请以@preserve指令予以保护。<br>注1：建议通过IDE的JavaDoc设置，来辅助@preserve指令的书写。
<h3><a>三、Jocky的限制</a></h3>&nbsp;&nbsp;&nbsp;正如前文所说，Jocky是基于源代码的混淆编译器，因此，Jocky不支持分别编译，必须对所有的源文件同时进行混淆编译。但事实上，倘若混淆级别控制在private级别上，该限制便不复存在。 
<p></a></a></p><img src ="http://www.blogjava.net/beansoft/aggbug/90748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2006-12-29 15:28 <a href="http://www.blogjava.net/beansoft/archive/2006/12/29/90748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 JDK 6 中的 JConsole 监控应用(原创)</title><link>http://www.blogjava.net/beansoft/archive/2006/12/13/87494.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Wed, 13 Dec 2006 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2006/12/13/87494.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/87494.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2006/12/13/87494.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/87494.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/87494.html</trackback:ping><description><![CDATA[<p>其实在 JDK 5 中已经新加入了这个功能了. 现在的 JDK 已经内置了对 VM 的监控功能. JDK 6 中这个工具变的更加好用了. 关于 JDK 5 中如何使用这个工具可以参考这里: <a title="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html" href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html</a></p> <p><a title="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html" href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html">http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html</a></p> <p>jconsole 可以很方便的监控本机的所有 Java 应用和远程的应用.</p> <p><strong>监控本地应用</strong></p> <p>&nbsp;首先就是启动您要监控的应用, 例如我用 JDK 1.6 来启动了 Tomcat, 或者 Eclipse 也可以, 可以在任务管理器(Ctrl+Alt+Del可以调出来, 或者在任务栏点击右键)里看到进程ID, 例如我这里是 6132.</p> <p>接着在 JDK 安装目录中(&lt;JDK_HOME&gt;/bin/jconsole.exe)启动 jconsole.exe (双击或者在 cmd 里面敲入 jconsole), 主界面会提示您建立一个新连接:</p> <p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image06.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="507" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image0_thumb2.png" width="473" border="0"></a> </p> <p>可以看到进程ID, 选择它, 然后点击"连接". 这些 ID 必须都是用 JDK 1.6 的 java.exe 启动的, 否则在列表里看不到.</p> <p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image09.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="543" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image0_thumb3.png" width="746" border="0"></a> </p> <p>JConsle 能监控内存,线程,类的数目和CPU然后点击各个 Tab 可以看到详细的输出, 详细的输出包括:<br>内存: 堆/非堆, 峰值, 内存的各个部分, 例如 Perm, Eden 等的大小曲线图.<br>线程: 峰值, 所有线程的列表, 堆栈跟踪(哪个对象中的线程)等. 还可以强制执行GC.<br>类: 峰值, 类总数曲线图.<br>MBean: 一些 JVM 参数的详细 MBean 信息.</p> <p><strong>监控远程进程</strong></p> <p>首先需要在运行的应用上启用远程管理, 参数如下(简单期间就不加用户验证了):<br>java -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar ../demo/jfc/Java2D/Java2Demo.jar</p> <p>然后连接的时候选择远程进程, 地址输入:</p> <p>localhost:1090</p> <p>即可.当然在别的电脑上(一般是局域网)可以输入那个电脑的IP.</p> <p>综述: 使用 JConsole 可以简单的监控 Server 状态, 但是本身要占一定的资源, 不过 JVM 自带的监控, 理论上讲应该是占资源很小很小的, 可以用它来方便的了解 Web 服务器应用进程的状态. 如果要调优应用, 还是使用 JProfiler 等工具更好一些, 当然它们占的资源也更大.</p> <p>后记:</p> <p>jdk1.6.0\demo\management\MemoryMonitor</p> <p>这里带了个很好的画内存曲线图的例子... 大家改改就可以实现同时监控多台 Server 的内存曲线了....</p> <p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image%7B0%7D%5B2%5D.png" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="376" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image%7B0%7D_thumb.png" width="413" border="0"></a> </p> <p>作者: <a href="mailto:BeanSoft@126.com">BeanSoft@126.com</a></p> <p>2006.12.13</p> <p>本文算是自己写的一个备忘资料.</p><img src ="http://www.blogjava.net/beansoft/aggbug/87494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2006-12-13 15:29 <a href="http://www.blogjava.net/beansoft/archive/2006/12/13/87494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搜集的一些好的 Java 书籍/文章</title><link>http://www.blogjava.net/beansoft/archive/2006/12/12/87273.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Tue, 12 Dec 2006 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2006/12/12/87273.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/87273.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2006/12/12/87273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/87273.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/87273.html</trackback:ping><description><![CDATA[
		<p>Java API文档中文版(JDK1.5) html_zh_CN.zip 35MB 来自: <a href="http://gceclub.sun.com.cn/download.html">http://gceclub.sun.com.cn/download.html</a></p>
		<p> </p>
		<p>继续整理中... Windows Live Writer, 好用!</p>
<img src ="http://www.blogjava.net/beansoft/aggbug/87273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2006-12-12 15:38 <a href="http://www.blogjava.net/beansoft/archive/2006/12/12/87273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>