﻿<?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-会漂的石头</title><link>http://www.blogjava.net/caoqingsong/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 09:07:53 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 09:07:53 GMT</pubDate><ttl>60</ttl><item><title>java中浮点数的计算</title><link>http://www.blogjava.net/caoqingsong/archive/2006/08/31/66808.html</link><dc:creator>曹青松</dc:creator><author>曹青松</author><pubDate>Thu, 31 Aug 2006 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/caoqingsong/archive/2006/08/31/66808.html</guid><wfw:comment>http://www.blogjava.net/caoqingsong/comments/66808.html</wfw:comment><comments>http://www.blogjava.net/caoqingsong/archive/2006/08/31/66808.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/caoqingsong/comments/commentRss/66808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caoqingsong/services/trackbacks/66808.html</trackback:ping><description><![CDATA[今天在数值计算时碰到一个问题.程序如下:<br />  double a = (3.3-2.4)/0.1;<br />  System.out.println(a);<br />你可能认为结果很简单,不就是9嘛,是事实上,结果为:8.999999998,为什么呢?我翻阅了一些资料,终于找出了原因.<br /><span class="title1"><strong>为什么浮点数会丢失精度？</strong></span>  
<ol><li><strong>十进制数的二进制表示可能不够精确</strong><br /><br />浮点数或是双精度浮点数无法精确表示的情况并不少见。浮点数值没办法用十进制来精确表示的原因要归咎于CPU表示浮点数的方法。这样的话您就可能会牺牲一些精度，有些浮点数运算也会引入误差。以上面提到的情况为例，2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。原因在于浮点数由两部分组成：指数和尾数。浮点数的值实际上是由一个特定的数学公式计算得到的。您所遇到的精度损失会在任何操作系统和编程环境中遇到。<br /><strong>注意：</strong> 您可以使用Binary Coded Decimal (BCD)库来保持精度。BCD数字编码方法会把每一个十进制数字位单独编码。 
</li><li><strong>类型失配</strong><br />您可能混合了浮点数和双精度浮点数类型。请确定您在进行数学运算的时候所有的数据类型全部相同。<br /><strong>注意：</strong><strong>float</strong>类型的变量只有7位的精度，而<strong>double</strong>类型的变量有15位的精度。 </li></ol><p><span class="title1"><strong>如何进行浮点数精度计算？</strong></span>             <br />      Java中的简单浮点数类型float和double不能够进行运算。不光是Java，在其它很多编程语言中也有这样的问题。在大多数情况下，计算的结果是准确的，但是多试几次（可以做一个循环）就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。<br />这个问题相当严重，如果你有9.999999999999元，你的计算机是不会认为你可以购买10元的商品的。<br />在有的编程语言中提供了专门的货币类型来处理这种情况，但是Java没有。现在让我们看看如何解决这个问题。<br /> <br />四舍五入<br />我们的第一个反应是做四舍五入。Math类中的round方法不能设置保留几位小数，我们只能象这样（保留两位）：<br />public double round(double value){<br />    return Math.round(value*100)/100.0;<br />}<br />非常不幸，上面的代码并不能正常工作，给这个方法传入4.015它将返回4.01而不是4.02，如我们在上面看到的<br />4.015*100=401.49999999999994<br />因此如果我们要做到精确的四舍五入，不能利用简单类型做任何运算<br />java.text.DecimalFormat也不能解决这个问题：<br />System.out.println(new java.text.DecimalFormat("0.00").format(4.025));<br />输出是4.02<br /> <br />BigDecimal<br />在《Effective Java》这本书中也提到这个原则，float和double只能用来做科学计算或者是工程计算，在商业计算中我们要用java.math.BigDecimal。BigDecimal一共有4个够造方法，我们不关心用BigInteger来够造的那两个，那么还有两个，它们是：<br />BigDecimal(double val) <br />          Translates a double into a BigDecimal. <br />BigDecimal(String val) <br />          Translates the String repre sentation of a BigDecimal into a BigDecimal.<br />上面的API简要描述相当的明确，而且通常情况下，上面的那一个使用起来要方便一些。我们可能想都不想就用上了，会有什么问题呢？等到出了问题的时候，才发现上面哪个够造方法的详细说明中有这么一段：<br />Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding. <br />The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one.<br />原来我们如果需要精确计算，非要用String来够造BigDecimal不可！在《Effective Java》一书中的例子是用String来够造BigDecimal的，但是书上却没有强调这一点，这也许是一个小小的失误吧。<br /> <br />解决方案<br />现在我们已经可以解决这个问题了，原则是使用BigDecimal并且一定要用String来够造。<br />但是想像一下吧，如果我们要做一个加法运算，需要先将两个浮点数转为String，然后够造成BigDecimal，在其中一个上调用add方法，传入另一个作为参数，然后把运算的结果（BigDecimal）再转换为浮点数。你能够忍受这么烦琐的过程吗？下面我们提供一个工具类Arith来简化操作。它提供以下静态方法，包括加减乘除和四舍五入：<br />public static double add(double v1,double v2)<br />public static double sub(double v1,double v2)<br />public static double mul(double v1,double v2)<br />public static double div(double v1,double v2)<br />public static double div(double v1,double v2,int scale)<br />public static double round(double v,int scale)<br />附录<br />源文件Arith.java：<br />import java.math.BigDecimal;<br />/**<br /> * 由于Java的简单类型不能够精确的对浮点数进行运算，这个工具类提供精<br /> * 确的浮点数运算，包括加减乘除和四舍五入。<br /> */<br />public class Arith{<br />    //默认除法运算精度<br />    private static final int DEF_DIV_SCALE = 10;<br />    //这个类不能实例化<br />    private Arith(){<br />    }<br /> <br />    /**<br />     * 提供精确的加法运算。<br />     * @param v1 被加数<br />     * @param v2 加数<br />     * @return 两个参数的和<br />     */<br />    public static double add(double v1,double v2){<br />        BigDecimal b1 = new BigDecimal(Double.toString(v1));<br />        BigDecimal b2 = new BigDecimal(Double.toString(v2));<br />        return b1.add(b2).doubleValue();<br />    }<br />    /**<br />     * 提供精确的减法运算。<br />     * @param v1 被减数<br />     * @param v2 减数<br />     * @return 两个参数的差<br />     */<br />    public static double sub(double v1,double v2){<br />        BigDecimal b1 = new BigDecimal(Double.toString(v1));<br />        BigDecimal b2 = new BigDecimal(Double.toString(v2));<br />        return b1.subtract(b2).doubleValue();<br />    } <br />    /**<br />     * 提供精确的乘法运算。<br />     * @param v1 被乘数<br />     * @param v2 乘数<br />     * @return 两个参数的积<br />     */<br />    public static double mul(double v1,double v2){<br />        BigDecimal b1 = new BigDecimal(Double.toString(v1));<br />        BigDecimal b2 = new BigDecimal(Double.toString(v2));<br />        return b1.multiply(b2).doubleValue();<br />    }<br /> <br />    /**<br />     * 提供（相对）精确的除法运算，当发生除不尽的情况时，精确到<br />     * 小数点以后10位，以后的数字四舍五入。<br />     * @param v1 被除数<br />     * @param v2 除数<br />     * @return 两个参数的商<br />     */<br />    public static double div(double v1,double v2){<br />        return div(v1,v2,DEF_DIV_SCALE);<br />    }<br /> <br />    /**<br />     * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指<br />     * 定精度，以后的数字四舍五入。<br />     * @param v1 被除数<br />     * @param v2 除数<br />     * @param scale 表示表示需要精确到小数点以后几位。<br />     * @return 两个参数的商<br />     */<br />    public static double div(double v1,double v2,int scale){<br />        if(scale&lt;0){<br />            throw new IllegalArgumentException(<br />                "The scale must be a positive integer or zero");<br />        }<br />        BigDecimal b1 = new BigDecimal(Double.toString(v1));<br />        BigDecimal b2 = new BigDecimal(Double.toString(v2));<br />        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();<br />    }<br /> <br />    /**<br />     * 提供精确的小数位四舍五入处理。<br />     * @param v 需要四舍五入的数字<br />     * @param scale 小数点后保留几位<br />     * @return 四舍五入后的结果<br />     */<br />    public static double round(double v,int scale){<br />        if(scale&lt;0){<br />            throw new IllegalArgumentException(<br />                "The scale must be a positive integer or zero");<br />        }<br />        BigDecimal b = new BigDecimal(Double.toString(v));<br />        BigDecimal one = new BigDecimal("1");<br />        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();<br />    }<br />}; </p><img src ="http://www.blogjava.net/caoqingsong/aggbug/66808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caoqingsong/" target="_blank">曹青松</a> 2006-08-31 11:16 <a href="http://www.blogjava.net/caoqingsong/archive/2006/08/31/66808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于将java程序做成exe文件的几种做法</title><link>http://www.blogjava.net/caoqingsong/archive/2006/08/28/66272.html</link><dc:creator>曹青松</dc:creator><author>曹青松</author><pubDate>Mon, 28 Aug 2006 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/caoqingsong/archive/2006/08/28/66272.html</guid><wfw:comment>http://www.blogjava.net/caoqingsong/comments/66272.html</wfw:comment><comments>http://www.blogjava.net/caoqingsong/archive/2006/08/28/66272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caoqingsong/comments/commentRss/66272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caoqingsong/services/trackbacks/66272.html</trackback:ping><description><![CDATA[
		<p style="BACKGROUND: #eeeeee">
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">    可以把普通的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Java</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">程序做成真正的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe,</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">也就是单一个</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">就可以在没有安装</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">JVM</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">的机器上运行。这样的工具常见的有</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">JET</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">和</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">gcj.</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">前者是收费的，而且做出来的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">还是需要一堆</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">dll</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">。推荐使用</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">gcj.</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">他有</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">windows</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">和</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Linux</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">版，直接下载</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">zip</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">包，不需要安装，里面有不少例子，一些</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">build</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">的批处理文件。从原理来说</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">gcj</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">自己实现了</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">JVM</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">规范，也就是你编写一个</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">HelloWorld.java,</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">其中的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">main</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">方法为</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">System.out.println("foo");<br /></span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">当使用</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">gcj</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">把它做成</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe(</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">大约</font>
				</span>
				<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?>
				<st1:chmetcnv w:st="on" unitname="m" sourcevalue="2" hasspace="False" negative="False" numbertype="1" tcsc="0">
						<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">2M</span>
				</st1:chmetcnv>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">)</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">，运行这个</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">时，会启动里面的一个小型</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">jvm,</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">在这上面跑</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">HelloWorld</span>
				<font face="宋体">
						<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</span>
						<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p style="BACKGROUND: #eeeeee">
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">其实，把</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Java</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">做成纯</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe</span>
				<font face="宋体">
						<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">实在是吃力不讨好，有很多限制，文件又大。</span>
						<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p style="BACKGROUND: #eeeeee">
				<font face="宋体">
						<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">我比较倾向另几种做法：</span>
						<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p style="BACKGROUND: #eeeeee">
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">. </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">使用</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">InstallAnywhere</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">等工具，制作一个</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">的安装包</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />
				</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">用户可以选择使用他机器上的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">JRE</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">或是这个安装包内的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">JRE</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">来运行程序</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />
				</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">这是很常见的一种做法，如</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">JBuilder</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">就是这么做的。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />
				</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">这样的好处是不要求对方机器上装有</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">JRE</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">，而且你原来的程序不需要任何改动。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />InstallAnywhere</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">中一个压缩的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">JRE</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">大概是</font>
				</span>
				<st1:chmetcnv w:st="on" unitname="m" sourcevalue="8" hasspace="False" negative="False" numbertype="1" tcsc="0">
						<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">8M</span>
				</st1:chmetcnv>
				<font face="宋体">
						<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</span>
						<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p style="BACKGROUND: #eeeeee">
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">. </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">制作成可执行的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">jar,</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">也就是在</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">META-INF</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">MANIFEST</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">文件制定</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Main-Class<br /></span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">可以通过命令行</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">java -jar jarfile.jar</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">来执行，</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">windows</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">默认的把</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">*.jar</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">使用</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">javaw -jar</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">打开，所以有些机器上可以直接双击</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">jar</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">运行。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<o:p>
						</o:p>
				</span>
		</p>
		<p style="BACKGROUND: #eeeeee">
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">. </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">制作伪</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe,</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">其实和上一种做法是一样的，只不过做成</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe,</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">调用系统的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">java.exe</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">来运行它，这样的工具有</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">nativeJ,exe4j</span>
				<font face="宋体">
						<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">等</span>
						<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p style="BACKGROUND: #eeeeee">
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />
				</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">其实</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Java</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">不像</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">VB,Delphi</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">只是一个语言，而是一个平台。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />jar</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">是最常用的部署单元，做成</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">没什么意思。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />
				</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">一、</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe4j</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">说明：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe4j</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">可以将</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Jar</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">文件制作成</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">文件，但需</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">jre</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">支持，也可将</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Jar</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">文件放在外面。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">软件性质：共享软件</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">下载地址：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<a href="http://www.ej-technologies.com/products/exe4j/overview.html">http://www.ej-technologies.com/products/exe4j/overview.html</a>
						<br />
				</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">二、</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">JBuilder</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">说明：新版本的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">JBuilder</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">可以直接把工程制作成各系统的可执行文件，包括</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Windows</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">系统。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">软件性质：商业软件</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">下载地址：略。我是从</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">eMule</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">下载的。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />
				</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">三、</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">NativeJ</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">说明：与</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe4j</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">功能类似。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">软件性质：共享软件</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">下载地址：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<a href="http://www.dobysoft.com/products/nativej/download.html">http://www.dobysoft.com/products/nativej/download.html</a>
						<br />
				</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">四、</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Excelsior JET</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">说明：可以直接将</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Java</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">类文件制作成</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">文件，除</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">AWT</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">和</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Swing</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">及第三方图形接口外可不需</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">jre</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">支持（</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Java5.0</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">不行）。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">软件性质：共享软件</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">下载地址：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<a href="http://excelsior-usa.com/home.html">http://excelsior-usa.com/home.html</a>
						<br />
				</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">五、</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">jshrink</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">说明：可将</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Jar</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">文件打包进</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">exe</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">文件。同时具有混淆功能（这才是它的主要功能）。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">软件性质：共享软件</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">下载地址：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<a href="http://www.e-t.com/jshrink.html">http://www.e-t.com/jshrink.html</a>
						<br />
				</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">六、</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">InstallAnywhere</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">说明：打包工具，对</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Java</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">打包最好用。可打包成各操作系统运行包。包括</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">Windows</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">系统。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">软件性质：商业软件。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">下载地址：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<a href="http://www.zerog.com/">http://www.zerog.com/</a>
						<br />
				</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">七、</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">InstallShieldX</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">说明：与</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">InstallAnywhere</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">类似，但比</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">InstallAnywhere</span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">功能强大。相对的，比较复杂，不易上手，我现在还没学会。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">软件性质：商业软件。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<br />    </span>
				<span style="FONT-SIZE: 11pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">下载地址：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: Verdana">
						<a href="http://www.installshield.com/">http://www.installshield.com/</a>
						<o:p>
						</o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/caoqingsong/aggbug/66272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caoqingsong/" target="_blank">曹青松</a> 2006-08-28 20:37 <a href="http://www.blogjava.net/caoqingsong/archive/2006/08/28/66272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IoC随笔</title><link>http://www.blogjava.net/caoqingsong/archive/2006/08/11/63018.html</link><dc:creator>曹青松</dc:creator><author>曹青松</author><pubDate>Fri, 11 Aug 2006 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/caoqingsong/archive/2006/08/11/63018.html</guid><wfw:comment>http://www.blogjava.net/caoqingsong/comments/63018.html</wfw:comment><comments>http://www.blogjava.net/caoqingsong/archive/2006/08/11/63018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caoqingsong/comments/commentRss/63018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caoqingsong/services/trackbacks/63018.html</trackback:ping><description><![CDATA[
		<strong>
				<font color="#0000ff">Ioc模式</font>
		</strong>
		<p>　　分离关注（ Separation of Concerns : SOC）是Ioc模式和AOP产生最原始动力，通过功能分解可得到关注点，这些关注可以是 组件Components, 方面Aspects或服务Services。</p>
		<p>　　从GoF设计模式中，我们已经习惯一种思维编程方式：Interface Driven Design 接口驱动，接口驱动有很多好处，可以提供不同灵活的子类实现，增加代码稳定和健壮性等等，但是接口一定是需要实现的，也就是如下语句迟早要执行：</p>
		<p>　　AInterface a = new AInterfaceImp(); </p>
		<p>　　AInterfaceImp是接口AInterface的一个子类，Ioc模式可以延缓接口的实现，根据需要实现，有个比喻：接口如同空的模型套，在必要时，需要向模型套注射石膏，这样才能成为一个模型实体，因此，我们将人为控制接口的实现成为"注射"。</p>
		<p>　　Ioc英文为 Inversion of Control，即反转模式，这里有著名的好莱坞理论：你呆着别动，到时我会找你。</p>
		<p>　　其实Ioc模式也是解决调用者和被调用者之间的一种关系，上述AInterface实现语句表明当前是在调用被调用者AInterfaceImp，由于被调用者名称写入了调用者的代码中，这产生了一个接口实现的原罪：彼此联系，调用者和被调用者有紧密联系，在UML中是用依赖 Dependency 表示。</p>
		<p>　　但是这种依赖在分离关注的思维下是不可忍耐的，必须切割，实现调用者和被调用者解耦，新的Ioc模式 Dependency Injection 模式由此产生了， Dependency Injection模式是依赖注射的意思，也就是将依赖先剥离，然后在适当时候再注射进入。</p>
		<p>Ioc模式（Dependency Injection模式）有三种：</p>
		<p>第一种类型 从JNDI或ServiceManager等获得被调用者，这里类似ServiceLocator模式。 1. EJB/J2EE<br />2. Avalon（Apache的一个复杂使用不多的项目） <br />第二种类型 使用JavaBeans的setter方法 1. Spring Framework,<br />2. WebWork/XWork <br />第三种类型 在构造方法中实现依赖 1. PicoContainer,<br />2. HiveMind </p>
		<p>　　有过EJB开发经验的人都知道，每个EJB的调用都需要通过JNDI寻找到工厂性质的Home接口，在我的教程EJB是什么章节中，我也是从依赖和工厂模式角度来阐述EJB的使用。</p>
		<p>　　在通常传统情况下，为了实现调用者和被调用者解耦，分离，一般是通过工厂模式实现的，下面将通过比较工厂模式和Ioc模式不同，加深理解Ioc模式。</p>
		<p>工厂模式和Ioc<br />　　假设有两个类B 和 C：B作为调用者，C是被调用者，在B代码中存在对C的调用：</p>
		<p>public class B{<br />　　 private C comp; <br />　　......<br />} <br /> </p>
		<p>　　实现comp实例有两种途径：单态工厂模式和Ioc。</p>
		<p>工厂模式实现如下：</p>
		<p>public class B{<br />　　 private C comp; <br />　　private final static MyFactory myFactory = MyFactory.getInstance();</p>
		<p>　　public B(){<br />　　　　this.comp = myFactory.createInstanceOfC();</p>
		<p>　　}<br />　　 public void someMethod(){<br />　　　　this.comp.sayHello();<br />　 } <br />　　......<br />} <br /> </p>
		<p>特点：</p>
		<p>每次运行时，MyFactory可根据配置文件XML中定义的C子类实现，通过createInstanceOfC()生成C的具体实例。 <br />使用Ioc依赖性注射( Dependency Injection )实现Picocontainer如下，B类如同通常POJO类，如下：</p>
		<p>public class B{<br />　　 private C comp; <br />　　public B(C comp){<br />　　　　this.comp = comp;<br />　　 }<br />　　 public void someMethod(){<br />　　　　this.comp.sayHello();<br />　　 }<br />　　......<br />} <br /> </p>
		<p>假设C接口/类有有一个具体实现CImp类。当客户端调用B时，使用下列代码：</p>
		<p>public class client{<br />　　 public static void main( String[] args ) {<br />　　　　DefaultPicoContainer container = new DefaultPicoContainer();<br />　　　　container.registerComponentImplementation(CImp.class);<br />　　　　container.registerComponentImplementation(B.class);<br />　　　　B b = (B) container.getComponentInstance(B.class);<br />　　　　b.someMethod();<br />　　 }<br />} <br /> </p>
		<p>　　因此，当客户端调用B时，分别使用工厂模式和Ioc有不同的特点和区别：</p>
		<p>　　主要区别体现在B类的代码，如果使用Ioc，在B类代码中将不需要嵌入任何工厂模式等的代码，因为这些工厂模式其实还是与C有些间接的联系，这样，使用Ioc彻底解耦了B和C之间的联系。</p>
		<p>　　使用Ioc带来的代价是：需要在客户端或其它某处进行B和C之间联系的组装。</p>
		<p>　　所以，Ioc并没有消除B和C之间这样的联系，只是转移了这种联系。<br />　　这种联系转移实际也是一种分离关注，它的影响巨大，它提供了AOP实现的可能。</p>
		<p>Ioc和AOP<br />　　AOP我们已经知道是一种面向切面的编程方式，由于Ioc解放自由了B类，而且可以向B类实现注射C类具体实现，如果把B类想像成运行时的横向动作，无疑注入C类子类就是AOP中的一种Advice</p>
		<p>　　通过下列代码说明如何使用Picocontainer实现AOP，该例程主要实现是记录logger功能，通过Picocontainer可以使用简单一行，使所有的应用类的记录功能激活。</p>
		<p>首先编制一个记录接口：</p>
		<p>public interface Logging {</p>
		<p>　　public void enableLogging(Log log);</p>
		<p>}<br /> </p>
		<p>有一个LogSwitcher类，主要用来激活具体应用中的记录功能：</p>
		<p>import org.apache.commons.logging.Log;<br />public class LogSwitcher<br />{<br />　 protected Log m_log;<br />　 public void enableLogging(Log log) {<br />　　　　m_log = log;<br />　　　　m_log.info("Logging Enabled");<br />　　}<br />} </p>
		<p>一般的普通应用JavaBeans都可以继承这个类，假设PicoUserManager是一个用户管理类，代码如下：</p>
		<p>public class PicoUserManager extends LogSwitcher<br />{ <br />　　..... //用户管理功能<br />}<br />public class PicoXXXX1Manager extends LogSwitcher<br />{ </p>
		<p>　　..... //业务功能<br />}<br />public class PicoXXXX2Manager extends LogSwitcher<br />{ </p>
		<p>　　..... //业务功能<br />}<br /> </p>
		<p>注意LogSwitcher中Log实例是由外界赋予的，也就是说即将被外界注射进入，下面看看使用Picocontainer是如何注射Log的具体实例的。</p>
		<p>
				<br />DefaultPicoContainer container = new DefaultPicoContainer();<br />container.registerComponentImplementation(PicoUserManager.class);<br />container.registerComponentImplementation(PicoXXXX1Manager.class); <br />container.registerComponentImplementation(PicoXXXX2Manager.class);<br />..... </p>
		<p>Logging logging = (Logging) container.getComponentMulticaster();</p>
		<p>logging.enableLogging(new SimpleLog("pico"));//激活log</p>
		<p>
				<br /> </p>
		<p>　　由上代码可见，通过使用简单一行logging.enableLogging()方法使所有的应用类的记录功能激活。这是不是类似AOP的advice实现？</p>
		<p>　　总之，使用Ioc模式，可以不管将来具体实现，完全在一个抽象层次进行描述和技术架构，因此，Ioc模式可以为容器、框架之类的软件实现提供了具体的实现手段，属于架构技术中一种重要的模式应用。</p>
<img src ="http://www.blogjava.net/caoqingsong/aggbug/63018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caoqingsong/" target="_blank">曹青松</a> 2006-08-11 15:43 <a href="http://www.blogjava.net/caoqingsong/archive/2006/08/11/63018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于J2EE轻量级架构的多层应用的研究</title><link>http://www.blogjava.net/caoqingsong/archive/2006/06/16/53158.html</link><dc:creator>曹青松</dc:creator><author>曹青松</author><pubDate>Fri, 16 Jun 2006 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/caoqingsong/archive/2006/06/16/53158.html</guid><wfw:comment>http://www.blogjava.net/caoqingsong/comments/53158.html</wfw:comment><comments>http://www.blogjava.net/caoqingsong/archive/2006/06/16/53158.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/caoqingsong/comments/commentRss/53158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caoqingsong/services/trackbacks/53158.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘  要:																						  																																				 																目前								J2EE								应用中，普遍使用了多层架构。本文提出了基于								J2EE								的轻量级多层架构，即业界比较成熟的								Stru...&nbsp;&nbsp;<a href='http://www.blogjava.net/caoqingsong/archive/2006/06/16/53158.html'>阅读全文</a><img src ="http://www.blogjava.net/caoqingsong/aggbug/53158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caoqingsong/" target="_blank">曹青松</a> 2006-06-16 09:52 <a href="http://www.blogjava.net/caoqingsong/archive/2006/06/16/53158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>