??xml version="1.0" encoding="utf-8" standalone="yes"?>精品国产1区2区3区,中文在线免费一区三区高中清不卡,国产伦久视频在线观看http://www.aygfsteel.com/chengang/category/8014.html    逝者如斯乎不舍昼夜zh-cnWed, 28 Feb 2007 06:42:21 GMTWed, 28 Feb 2007 06:42:21 GMT60E序DEBUGQ查扄所在的JAR?/title><link>http://www.aygfsteel.com/chengang/archive/2006/09/13/69311.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Wed, 13 Sep 2006 02:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/chengang/archive/2006/09/13/69311.html</guid><wfw:comment>http://www.aygfsteel.com/chengang/comments/69311.html</wfw:comment><comments>http://www.aygfsteel.com/chengang/archive/2006/09/13/69311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chengang/comments/commentRss/69311.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chengang/services/trackbacks/69311.html</trackback:ping><description><![CDATA[ <p>在调试程序解决程序BUGӞ我们常要看看所调用的类来自于那一个JAR包。要实现q一目的可以监看如下ҎQ?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <span style="COLOR: #000000">org.jbpm.JbpmConfiguration.</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">.getProtectionDomain()<br /></span> </div> <p> <br />从下面的信息可以清楚看到JbpmConfigurationcL自于<span style="COLOR: #000000">D:</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">jbpm</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">starters</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">kit</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">3.1</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">jbpm</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">build</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">jbpm</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">3.1</span><span style="COLOR: #000000">.jar</span>Q?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <span style="COLOR: #000000">ProtectionDomain  (file:</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">D:</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">jbpm</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">starters</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">kit</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">3.1</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">jbpm</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">build</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">jbpm</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">3.1</span> <span style="COLOR: #000000">.jar </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">no signer certificates</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000">)<br /> sun.misc.Launcher$AppClassLoader@7259da<br /> </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">no principals</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> <br /> java.security.Permissions@17ba38f (<br /> (java.io.FilePermission \D:\jbpm</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">starters</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">kit</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">3.1</span> <span style="COLOR: #000000">\jbpm\build\jbpm</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">3.1</span> <span style="COLOR: #000000">.jar read)<br /> (java.lang.RuntimePermission exitVM)<br />)</span> </div> <br />查看q样的信息是很有用的。比如运行的pȝ中有可能存在有两个JAR包同时含有某一个类Q因为JAVA的ClassLoader有先后顺序。你可能发现自己无法怎么改程序,但运行v来却象根本没有改q一P那么原因可能出在这里?br /><br />另外Q还可以用getMethod得到所有的ҎQ这可以认你增加的Ҏ是否已经装蝲到JVM中了<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">org.jbpm.JbpmConfiguration.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">.getMethods()</span></div><img src ="http://www.aygfsteel.com/chengang/aggbug/69311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chengang/" target="_blank">陈刚</a> 2006-09-13 10:00 <a href="http://www.aygfsteel.com/chengang/archive/2006/09/13/69311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个体现Java接口及工厂模式优点的例子http://www.aygfsteel.com/chengang/archive/2006/09/10/68824.html陈刚陈刚Sun, 10 Sep 2006 09:47:00 GMThttp://www.aygfsteel.com/chengang/archive/2006/09/10/68824.htmlhttp://www.aygfsteel.com/chengang/comments/68824.htmlhttp://www.aygfsteel.com/chengang/archive/2006/09/10/68824.html#Feedback0http://www.aygfsteel.com/chengang/comments/commentRss/68824.htmlhttp://www.aygfsteel.com/chengang/services/trackbacks/68824.htmlwww.chengang.com.cn


     随着模式概念的普及,了解模式和用模式的E序员越来越多,很多人在学习模式的时候,都会有这样一U疑惑:“有必要搞得q么复杂吗?”。的,因ؓ教程的例子过于简单化Q这h便读者学习)Q或者是作者选例子的时候ƈ没有很好体现所讲模式的优点Q很多情况下如果仅就其例子的问题来说Q用模式是太复杂了。因此才Dq样的误解:“模式就是把单的问题复杂化吗Q”。当然不是,随着你开发实늚不断丰富Q你l会发现模式强大威力Q而且模式也ƈ非贵族化的编E方式,它就是一些经q提g的解决问题的Ҏ技巧?
 
      通过学习模式Q程序员开始告别过d直线式的代码方式Q模式开扩了我们的视野,强化了我们面向对象编E的思维方式。然而现在又出现了另一个普遍的问题Q盲目应用模式。模式是问题的解x案,先有问题才有模式Q模式是依附于所要解决的问题的而生的。必M解模式在很多情况下是以提高代码的复杂度ؓ代h来增强灵zL、可复用性。如果在自已的代码中使用某一模式仅只提高了代码的复杂度,而其它方面收效甚微,或者某部䆾代码Ҏ׃存在灉|性及高复用性的需求,那么我们没有必要ؓ使用模式而放弃更直观单的代码写法?/div>
 
      一的高手90%_֊x问题的解x案,因ؓ扑ֈ了好的解x案,再写起代码会很轻松代码也z流畅,看这L代码是一Un受和提高Q二的熟手90%_֊x代码实现Q因为问题的解决Ҏq最佻I实现的代码也会比较复杂;三流菜鸟记流水帐,90%_֊在敲键盘Q常常做了大半才发现行不通,回过头来再用90%的时间敲键盘Q根本不会用CQ何模式,写出来的代码的只有他自已才能看懂。做出来的Y件也是支ȝ,做一丁点改动都要大费周折Q而且你还不知道改动后会生什么问题,大有住危戉K的感觉?/div>
 
      在这里还是D一个滥用模式的例子吧。我曑֏与过一个大集团公司QApȝ的第二期开发,开发沿用原有代码架构ƈ增加新的功能模块。文档很我d代码时就被它E序里的代码转来转去搞得头大如斗Q最后读懂了Q原代码架构M采用工厂模式Q而且是最复杂的抽象工厂模式。它把所有模块类都通过工厂生成q工厂套工厂Qƈ且每一个模块类都有一个接口,每个接口也只有一个模块现实类Q因为涉及权限控制还用了代理(proxy)模式。 L代码后我开始嵌入代码,发现每新增一个类Q都要到六个Java文g中去增加相应代码Q而在cM每增加一个方法,也要到它的接口等四个Java文g中去增加相应代码。天呀Q!Q记得当时我的小姆指怼不听使唤Q就是因为频J的使用Ctrl+C 、Ctrl+VQ小姆指按着Ctrl键给累的。整个项目组苦不堪言Q真烦透了。项目结束后我回֏玎ͼ代理模式用得q对Q现在针Ҏ限这cL向控制有AOP~程q种新的解决办法了)但工厂模式在q里Ҏ是画蛇添Q不仅没有解决什么问题,反而增加代码复杂度和耦合性,降低了开发效率连l护隑ֺ都提高了。而且那种每个cȝ单的加一个接口的方式Q更是没有道理,q让我很惌周星驰说q的一句话Q“球~~~不是q么t~~~~的,接口~~~不是q么用~~~的”。言归正传,我们先来看这样一个常见问题:某系l需要支持多U类型的数据库。用qOracle、MSSQL{数据库的h都知道,它们的SQL~写方式都各有些不同。比如说Oracle的唯一标识自动+1字段用的是序列,MSSQL改一下字D属性就成了Q还有各U各自特有的SQL用法。ؓ了支持多数据库,N我们要开发多套系l?当然NO。请看下面的解决Ҏ?/div>
 
      即然数据库存在多U,我们可以系l中所有对数据库的操作抽象出来Q写成一个个Ҏl合C个类中,有几U数据库我们写几个q样的类。具体设计类囑֦下:
20060910.gif
 
 
要说明:
  • OracleDataOperate、SqlserverDataOperate、MysqlDataOperateQ分别代表Oracle、Sqlserver、Mysqlq三U数据库的操作类。承自AbstractDataOperate
  • AbstractDataOperate是一个抽象类Q包含了那些不同U类数据库都是一样代码的操作Ҏ。承自DataOperate
  • DataOperate是上面说的数据操作类的统一接口Q只有两个方法:取得一条记录、插入一条记录?
  • DataOperateFactory是一个工厂方法,l一用它的方法来得到数据库操作类的实例?
  • SampleClass是我们系l的某个功能模块的类?
  • People是一个实体类Q代表一条记录。三个字Dcoid唯一标识W、name姓名、date生日?/li>
 
详细说明Q?/strong>
Q、所有系l功能模块类只认DataOperatq个接口q不必管具体的实现类是OracleDataOperateqSqlserverDataOperate。DataOperate源代码如下:
publicinterface DataOperate {
    //Ҏ记录的唯一标识取出一条记?/div>
    People getPeople(String oid);
    //插入一条记?/div>
    boolean insertPeople(People people);
}
 
Q、AbstractDataOperate、OracleDataOperate、SqlserverDataOperate、MysqlDataOperate都是l承DataOperate接口的,没什么好说的Q省略?/div>
 
Q、DataOperateFactory。我们看看工厂方法怎么写的?/div>
publicclass DataOperateFactory {
    publicstaticfinalint ORACLE = 0; //定义三个表示数据库类型的帔R
    publicstaticfinalint MYSQL = 1;
    publicstaticfinalint SQLSERVER = 2;
 
    privatestatic DataOperate db;
    privatestaticint dataType = MYSQL;
    /**
     * Ҏ数据库类?dataType)取得一个数据库操作cȝ实例Q?/div>
     * q里对DataOperate使用了单例模式,因ؓOracelDataOperate{都是无状态的工具c,
     * 所以整个系l只保留一个实例就行了?/div>
     *
     * @return q回的是接口Q客L不必兛_具体是用那个实现c?/div>
     */
    publicstatic DataOperate getInstance() {
        if (db == null) {
            if (dataType == ORACLE) //ҎdateTypeq回相应的实现类
                returnnew OracelDataOperate();
            if (dataType == MYSQL)
                returnnew MysqlDataOperate();
            if (dataType == SQLSERVER)
                returnnew SqlserverDataOperate();
        }
        return db;
    }
}
 
Q、接下来q看用端是如何调用工厂方法和使用数据操作cȝ?/div>
/**
 * pȝ某个功能c?/div>
 */
publicclass SampleClass {
private DataOperate db; //声明一个数据库操作c,注意q里用的是接口噢
    /**某方?/
    publicvoid sampleMethod() {
        db = DataOperateFactory.getInstance();//得到单一实例
        People p = db.getPeople("123"); //取得一条记?/div>
        db.insertPeople(p);//再插回去
    }
}
 
  我们发现SampleClass中根本没有出现OracelDataOperate、MysqlDataOperate{的影子Q这是接口的威力。客L不必针对OracelDataOperate{写不同的代码,它只兛_DataOperate卛_Q具体要取那个类的逻辑qDataOperateFactory负责了?/div>
 
ȝQ?/div>
  • 从例子中我们可以看到什么是面向接口的编E方式。SampleClass使用数据操作cd以不必关心具体是那个c,只要是符合接口的都行
  • 要实例?只须调用DataOperateFactory.getInstance()卛_Q其它的交于DataOperateFactoryq个工厂来做吧,使用端什么都不用兛_?/div>
  • 我们要支持新的数据库cdQ只要象OracelDataOperate那样Q再写一个承AbstractDataOperate的类卛_Q比如SysbaseDataOperate。然后到DataOperateFactory中加入相应代码即可?/div>
  • 如果我们惌可配|性更高,可以?b>privatestaticint dataType = MYSQL;中的D|到一个文本文件中?/div>
  对于开发支持多U数据库的系l,强烈使用hibernateQ我现在做的pȝ是用hibernate的,开发时用MysqlQ到要给客户时将数据库换了DB2Q程序不用做M改动Q真正的无逢移植。不q这P本文所提到的方法就没什么用?


陈刚 2006-09-10 17:47 发表评论
]]>JAVA Appliation下取得资源文件的路径http://www.aygfsteel.com/chengang/archive/2006/09/08/68585.html陈刚陈刚Fri, 08 Sep 2006 10:54:00 GMThttp://www.aygfsteel.com/chengang/archive/2006/09/08/68585.htmlhttp://www.aygfsteel.com/chengang/comments/68585.htmlhttp://www.aygfsteel.com/chengang/archive/2006/09/08/68585.html#Feedback2http://www.aygfsteel.com/chengang/comments/commentRss/68585.htmlhttp://www.aygfsteel.com/chengang/services/trackbacks/68585.htmlConfigFactoryImplTest要去dboss-connector-service.xml?br />
200609081.jpg

那么如果得到q个文g呢?先看下面的一个对路径的测试代?br />
import java.io.File;
public class PathTest {
  
public static void main(String[] args) throws Exception {
    System.out.println(
    Thread.currentThread().getContextClassLoader().getResource(
""));
    System.out.println(PathTest.
class.getClassLoader().getResource(""));
    System.out.println(ClassLoader.getSystemResource(
""));
    System.out.println(PathTest.
class.getResource(""));
    System.out.println(PathTest.
class.getResource("/"));
    System.out.println(
new File("").getAbsolutePath());
    System.out.println(System.getProperty(
"user.dir"));
  }
}


打印各种路径l果如下Q?br />
file:/E:/wxxr_projects2/wxxr-applications/wxxr-boss-connector/target/test-classes/
file:
/E:/wxxr_projects2/wxxr-applications/wxxr-boss-connector/target/test-classes/
file:
/E:/wxxr_projects2/wxxr-applications/wxxr-boss-connector/target/test-classes/
file:
/E:/wxxr_projects2/wxxr-applications/wxxr-boss-connector/target/test-classes/com/wxxr/boss/config/
file:
/E:/wxxr_projects2/wxxr-applications/wxxr-boss-connector/target/test-classes/
E:\wxxr_projects2\wxxr
-applications\wxxr-boss-connector
E:\wxxr_projects2\wxxr
-applications\wxxr-boss-connector


发现PathTest.class.getResource("")得到了绝对\径,嗯,它了。于是将ConfigFactoryImplTestc里的代码书写如下(q里是用DOM来读XMLQ:

    private static Element getRootElement() throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db 
= dbf.newDocumentBuilder();
        Document doc 
= db.parse(ConfigFactoryImplTest.class.getResource(""+ "boss-connector-service.xml");
        
return doc.getDocumentElement();
    }


后记Q?br />得到资源文g的\径,在不同的环境Q如QEclipse RCP、Tomcat、Weblogic、简单的Java ApplicationQ,Ҏ都是略有不同的。具体的环境要具体分析?img src ="http://www.aygfsteel.com/chengang/aggbug/68585.html" width = "1" height = "1" />

陈刚 2006-09-08 18:54 发表评论
]]>
聚集Collection的技?/title><link>http://www.aygfsteel.com/chengang/archive/2006/04/01/38611.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Sat, 01 Apr 2006 07:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/chengang/archive/2006/04/01/38611.html</guid><wfw:comment>http://www.aygfsteel.com/chengang/comments/38611.html</wfw:comment><comments>http://www.aygfsteel.com/chengang/archive/2006/04/01/38611.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chengang/comments/commentRss/38611.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chengang/services/trackbacks/38611.html</trackback:ping><description><![CDATA[ <div>1、  MAP<br />特点Q同键的新值将覆盖旧倹{?br />CZQ?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">        Map</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">String, String</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> map </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">String, String</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">();<br />        String str;<br />        str </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> map.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">str=null</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        str </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> map.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">str=a</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        str </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> map.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">c</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">str=b 新D盖旧|最后map只有(1,c)一个倹{返回的b是被覆盖的?br /></span></div><br />循环遍历Q?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">        Map</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">String, Long</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> map </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">String, Long</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">();<br />        map.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Long(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">));<br />        map.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Long(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">));<br /><br />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (Map.Entry</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">String, Long</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> entry : map.entrySet()) {<br />            String key </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> entry.getKey();<br />            Long value </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> entry.getValue();<br />        }<br /></span></div><br />2、Set<br />特点Q无序排列,不会存在重复的|d重复g不会报错.Set可以加入null?br />CZQ?/div> <div> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <span style="COLOR: #000000">        Set</span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">String</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> set </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> HashSet</span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">String</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000">();<br />        </span> <span style="COLOR: #0000ff">boolean</span> <span style="COLOR: #000000"> b;<br />        b </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> set.add(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">1</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">b=true</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #000000">        b </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> set.add(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">2</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">b=true</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #000000">        b </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> set.add(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">1</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">b=false</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #000000">        b </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> set.add(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">2</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">b=false q回gؓfalseQ表C没有加?br /></span> </div> <br />3、List<br />特点Q有序排序,可以加入重复的元?br />CZQ?/div> <div> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <span style="COLOR: #000000">        Arrays.asList(</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> String[] {</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">11</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">222</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> });</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">q回一个不可改的List</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #000000">        List</span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">String</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> l </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> Arrays.asList(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">11</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">222</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">333</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br />        l.subList(</span> <span style="COLOR: #000000">1</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #000000">2</span> <span style="COLOR: #000000">); </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">q二个和第三个元素生成一个新List</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #000000"> <br />        ArrayList</span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">String</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> list </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> ArrayList</span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">String</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000">(l); </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">生成一个可改的List</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #000000">        </span> <span style="COLOR: #0000ff">boolean</span> <span style="COLOR: #000000"> b;<br />        b </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> list.add(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">11</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">b=true  List可以加入重复的元?/span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #000000">        b </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> list.add(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">11</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">b=true<br /></span> </div> <br />4、Collections<br />特点QCollections.class是集合的工具Ҏc?br />CZQ?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">        List</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> list1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">();<br />        List</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> list </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">();<br /><br />        Collections.sort(list); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">排序</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> pos </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Collections.binarySearch(list, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">key</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用二叉树法来查找,首先得排序好</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pos=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> pos);<br /><br />        Collections.copy(list, list1); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">把list1复制到list上,原list元素被覆?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        Collections.fill(list, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ss</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">?ss"填充list</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        Collections.max(list); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">找最大元?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        Collections.reverse(list); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">把排?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        Collections.shuffle(list);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">混ؕ排序</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000"><br />        Collections.singleton(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ss</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">q回一个Set集合Q不可改Q只有ss一个元?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        Collections.unmodifiableList(list);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">q回一个不可改的新的ListQ原list不变</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        Collections.synchronizedList(list);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">q回一个同步的新的ListQ原list不变<br /></span></div></div> <br />5、Properties<br />特点QPropertiesl承自HashtableQ是Map的一个实现。不q它在读取Properties文gҎ特别方便<br />CZQ?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">        Properties p </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.getProperties(); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">得到pȝ属?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        p.list(System.out);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">打印所?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br />         * 从user.home=C:\Documents and Settings\chengang<br />         * dproperties文g填充到Properties<br />         </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />        Properties p2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.getProperties(); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">得到pȝ属?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        File file </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> File(p.getProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">user.home</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">), </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">argo.user.properties</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />        p2.load(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileInputStream(file));<br />        System.err.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">------------------------------</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />        p2.list(System.out);<br /></span></div><img src ="http://www.aygfsteel.com/chengang/aggbug/38611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chengang/" target="_blank">陈刚</a> 2006-04-01 15:48 <a href="http://www.aygfsteel.com/chengang/archive/2006/04/01/38611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAAS在Java Web Start中的讄http://www.aygfsteel.com/chengang/archive/2006/03/07/34077.html陈刚陈刚Tue, 07 Mar 2006 06:53:00 GMThttp://www.aygfsteel.com/chengang/archive/2006/03/07/34077.htmlhttp://www.aygfsteel.com/chengang/comments/34077.htmlhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34077.html#Feedback0http://www.aygfsteel.com/chengang/comments/commentRss/34077.htmlhttp://www.aygfsteel.com/chengang/services/trackbacks/34077.html

?陈刚 from www.chengang.com.cn

一、前a

  我这个AdminConsole目是用Java Web StartQ简UJWSQ来让用戯问的Q后来在用户d部䆾用到了JAASQ而JAAS有一个登录配|文件的讑֮。过去,我一直是在Eclipse的Run里做讄?Djava.security.auth.login.config=D:\wxxr\login.config”,如下图:

  但这只是权宜之计Q在项目从本地以JWS发布到服务器׃到两个问题Q(1Qؓ了灵z,不能引用l对地址的(2Q在JWS中怎么讑֮对login.config的引用?BR>
  JAAS中对配置文glogin.config的引用,主要有两U方法:
Q?Q动态配|:?Djava.security.auth.login.config=D:\wxxr\login.config”。它其实是java.exe的一个参敎ͼ你可以像我一样在Eclipse的run里设|,也可以在命o行运行程序的方式中指定:c:\jdk\bin\java -Djava.security.auth.login.config=D:\wxxr\login.config -jar.......?BR>Q?Q在E序里静态配|:System.setProperty("java.security.auth.login.config", "D:\wxxr\login.config");

二、JWS中对JAAS动态配|的Ҏ

  在JWS中,如果你想动态配|的Q则在JWS的jnlp文g里设|如下:
 <resources>
  <j2se version="1.4+" href=" ........  
 </resources>

或?BR>
 <resources>
  <j2se version="1.4+" href="
  <property name="java.security.auth.login.config" value="D:\wxxr\login.config"/>
 ........  
 </resources>

  上面的设|有一个关键问题:对login.config引用的是l对地址Q这个地址不是指向服务器端的地址Q而是客户端的地址。这也就要求客户在D:\wxxr\目录含有login.config文gQ显然我们不能对客户有这U麻烦要求(最好就是客户什么都不用做,q也是JWS的存在的价值和目的Q?BR>  因此q里q有一个变通的ҎQ把“D:\wxxr\login.config”改成“http://your_website:8080/adminconsole/login.config”,q样׃ȝ上定位login.configQ而不必再把login.config安装在客L里了?BR>

三、JWS中对JAAS静态配|的Ҏ

  在上面的用web url的方法中q是有一点缺Plogin.config是可以被其他客戯易看到的Q安全性不高。而且服务器的|站名变了以后,q得相应修改jnlp文g。所以我们不妨考虑一下静态配|的ҎQ用静态配|方法之后,׃用在jnlp文g里配|了Q少了不了麻烦?BR>
W一U:

System.setProperty("java.security.auth.login.config"new URL(BasicServiceImpl.getInstance().getCodeBase(),"login.config").toString());

说明Q?BR>Q?QBasicServiceImpl是JDK's javaws.jar包中的类Qjdk\jre\javaws\javaws.jarQ?BR>Q?QBasicServiceImpl.getInstance().getCodeBase()得到的值是“http://your_website:8080/adminconsole/”,q个q是和前面web url其实一P只不q它是动态获得web url。至于如何获得服务器的\径的那种Q对于普通的java application我没研究q,我只试过下面eclipse RCP的?BR>Q?Q你只需要保?A href="http://your_website:8080/adminconsole/login.config">http://your_website:8080/adminconsole/login.config 能访问到login.config文g卛_?BR>
W二U:在Eclipse RCPE序中设|的Ҏ

String path = AdminConsolePlugin.getDefault().find(new Path("properties/login.config")).toString(); //AdminConsolePlugin是目的那***Plugin.java文gQ不同的目会不同?/SPAN>
logger.info("login.config path=" + path); //logger是log4j的一个对象,你可以把q一行删?/SPAN>
System.setProperty("java.security.auth.login.config", path);

  path的值有Ҏ,是“bundleentry://3/properties/login.config”。properties/login.config在服务器上的位置如下图:


  注:Eclipse RCP要装在JWS上,q得用一个开源Y件WebRCPQ?A >http://sourceforge.net/projects/webrcp。此开源Y件简单易用,q文档都不用看。它提供的webrcp-tutorialQ本w就是一个RCP使用webrcp的例子,你只需要参照archives\tutorial.zip的目录结构将自己的RCP目打包Q然后用自己目的zip替换掉archives\tutorial.zip卛_。如果你x一个zip名字Q则需要修改tutorial.jsp文gQ其实也是一个jnlpQ中的?lt;property name=....>”相应的几项?BR>

参考资料:
http://forum.java.sun.com/thread.jspa?threadID=612861&tstart=300
http://forum.java.sun.com/thread.jspa?threadID=621588&messageID=3523625



陈刚 2006-03-07 14:53 发表评论
]]>Java Web Start?/title><link>http://www.aygfsteel.com/chengang/archive/2006/03/07/34076.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Tue, 07 Mar 2006 06:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/chengang/archive/2006/03/07/34076.html</guid><wfw:comment>http://www.aygfsteel.com/chengang/comments/34076.html</wfw:comment><comments>http://www.aygfsteel.com/chengang/archive/2006/03/07/34076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chengang/comments/commentRss/34076.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chengang/services/trackbacks/34076.html</trackback:ping><description><![CDATA[<P align=center>?陈刚 from <A >www.chengang.com.cn</A></P> <P>  最q由于工作关p,老大嘱咐我看一下Java Web Start。以前安装JDKӞ会在“开始”菜单加一个快捯单“Java Web Start”,也不知是做什么用的,我一般都是删除。今天从|上查了一下资料,不看不知道,一看吓一跻I觉得qJWSQJava Web StartUͼ很象传说中的“服务器端小E序下蝲q行”。而且JWS很早有了,我看有些文章资料已经?002q发的,自己竟然全然不知它的存在Q实在是愚昧呀?/P> <H5>1.  JWS有什么用</H5> <P>  B/S风行的一个很大原因就是它有部|方便的优势Q这是C/S的Application所无法比拟的。现在,JWS让用户可以下载服务器端的Java Application到本行,q且没有安装、配|等J琐的操作。SUN|站上有DemoQ大家可以体验一下效果:<A >http://java.sun.com/products/javawebstart/demos.html</A>  ?/P> <H5>2.  JWS的运行原?/H5> <P>  览器的q行Java Applica ton的链接指向的不是E序本nQ而是一?.jnlp文gQ这个文件包含了Java Application的一些配|信息。然后JWS解读q个文g的信息,服务器端的Java Application下蝲到本ZQƈq行?/P> <P>  当然W一ơ运行程序时Q由于要下蝲所以速度会稍微慢一些,不过W二ơ运行时QJWS会自动去服务器上查是否有新的E序版本发布Q如果没有就会直接运行本机已l下载的E序Q这和q行本机Java Application没什么区别了。运行程序之初,JWSq会提示你是否创Z个相应的快捷菜单?/P> <P>  E序下蝲到本机的默认位置是:“C:\Documents and Settings\admin\Application Data\Sun\Java\Deployment\javaws\cache\indirect\indirect12423.ind”,你可以在本机的“JWS应用E序理器”的里重新设|此存放目录?/P> <P><A target=_blank><IMG src="http://blog.sina.com.cn/pic/54bde01c0200003g" border=0></A></P> <P>  JWS无疑要比Applet的应用范围更q(据说q得q*Q的最佛_意奖Q,它对于布|一些小型的E序应用是非常方便的Q但我以为现在还主要适用于局域网。因Z个程序一般约有几十MQ如果是Internet用户W一ơ的下蝲速度会很慢?/P> <H5>3.  安全性问?/H5> <P>  但和Applet一PJWS也面临安全性问题,默认情况下JWSҎ机磁盘和本地|络的访问是有限制的。如果该E序要越权访问,q时会弹Z个警告框Q类gActivX的数字签名)Q用户可以自已决定是否信任该软gQ而对其放开限制?/P> <H5>4.  JWS的优~点</H5> <P>  JWS的优点就是让E序的布|更单,而且用户端的应用可以时刻保持和服务器端的最新版本同步,qؓ升版本提供了很大的方便。缺点也是明昄Q由于要q行应用必须一ơ下载所有的E序文gQJWS的jnlp配置文g有个lazy选项Q但作用不明显)Q所以第一ơ下载速度很慢Q不适用于互联网。从q一Ҏ看B/S形式的应用还是有优势的?/P> <H5>5.  参考资?/H5> <P><A >http://www.chinaitlab.com/www/news/article_show.asp?id=25239</A><BR><A >http://blog.csdn.net/emag_java/archive/2005/01/13/252047.aspx</A>  </P> <H3> </H3> <H3>Java Web Start实例</H3> <H5>1、示例说?/H5> <P>  ׃本BLOGC要以Eclipse和SWT为内容,所以Java Web StartQ简UJWSQ也以一个SWT应用E序来做为示例。本文用QEclipse从入门到_N>书中打包一章的打包l果为示例,该示例ؓ一个SWT/JFaceE序Q其打包后的文gl构如下Q?BR><A target=_blank><IMG src="http://blog.sina.com.cn/pic/54bde01c0200003h" border=0></A></P> <P>说明Q?nbsp;</P> <UL> <LI>myswt是主包,里面含有自己写的E序代码 <LI>swt-win32-3063.dll是本地化文g <LI>lib子目录下q有三个jar文gQjface.jar、runtime.jar、swt.jarQ这三个文g是SWTE序的支持库</LI></UL> <P>  如果是在本地q行此程序,双击myswt.jar卛_Q要求Windows中jar格式的文仉认用javaw.exe打开Q如下图所C:<A target=_blank><IMG src="http://blog.sina.com.cn/pic/54bde01c0200003i" border=0></A></P> <P>  现在我们要将q个E序用JWS部v到服务器端,然后~写一个网,让用户单ȝ上的链接就可以下蝲该SWTE序q运行?/P> <H5>2、准备工?/H5> <P>本h的开发环境ؓQWinodwsXP SP2 Q?JDK1.4.2 Q?Tomcat 5.0.28<BR>Q?Q首先得先安装TomcatQ这一步的操作Ҏ本文省略<BR>Q?Q在Tomcat的webapps\ROOT路径下创Z个“myswt”目录。在我的电脑上,其绝对\径如下:E:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\ROOT\myswt?BR>Q?Q将前面所q的SWTE序的文件复制到webapps\ROOT\myswt目录中?/P> <H5>3、生成证?/H5> <P>创徏一个批处理文gQkey.bat</P> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 106.51%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 64px; BACKGROUND-COLOR: #eeeeee"><PRE><P class=a0><SPAN lang=EN-US>c:\jdk\bin\keytool -genkey -keystore myKeystore -alias myself</SPAN></P><P class=a0><SPAN lang=EN-US>c:\jdk\bin\keytool -list -keystore myKeystore</SPAN></P><P class=a0><SPAN lang=EN-US>pause</SPAN></P></PRE></DIV> <P>说明Q?/P> <UL> <LI>keytool是JDK自带的一个工P用于数字{֐。在我的电脑Q它是位于c:\jdk\bin\路径下,׃我没有设|环境变量pathQ所以在批处理文件中性指定keytool的\径。如果是自己用或者公司内部用Q象本文q样用keytool生成一个自{֐的证书也可以了。但如果你想让签名更正式一些,以获得其他用L信QQ最好去认证中心Q如 Thawte ?VeriSignQ获取一个证书? <LI>W一句将生成一个证书,文g名:myKeystore <LI>W二句是列出密钥证书中的所有入口。(q一句是可选的Q只是ؓ了显C出来看一下,不要也行Q? <LI>最后一句是暂停pauseQ以便批处理完成后,我们可以回顾一下全q程?/LI></UL> <P>q行批处理key.bat后的全部输入q程如下图所C:</P> <P><A target=_blank><IMG src="http://blog.sina.com.cn/pic/54bde01c0200003j" border=0></A></P> <H5>4、用证用为应用程序签?/H5> <P>Q?Q因为签名只认jar包,所以先swt-win32-3063.dll文g用WinRAR或c:\jdk\bin\jar打一个jar?swt-win32-3063.jar)。客L下蝲后,会自动解开此包Q将swt-win32-3063.dllq原到客L?/P> <P>注意Q如果你用WinRAR打包Q在压羃时必选ZIP格式Q不能选RAR格式?/P> <P>Q?Q创Z个用于签名的批处理文Ӟjarsigner.batQ其内容如下Q?/P> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 118.55%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 91px; BACKGROUND-COLOR: #eeeeee"><PRE><P class=a0><SPAN lang=EN-US>c:\jdk\bin\jarsigner -keystore myKeystore myswt.jar myself</SPAN></P><P class=a0><SPAN lang=EN-US>c:\jdk\bin\jarsigner -keystore myKeystore lib\jface.jar myself</SPAN></P><P class=a0><SPAN lang=EN-US>c:\jdk\bin\jarsigner -keystore myKeystore lib\runtime.jar myself</SPAN></P><P class=a0><SPAN lang=EN-US>c:\jdk\bin\jarsigner -keystore myKeystore lib\swt.jar myself</SPAN></P><P class=a0><SPAN lang=EN-US>c:\jdk\bin\jarsigner -keystore myKeystore swt-win32-3063.jar myself</SPAN></P><P class=a0><SPAN lang=EN-US>pause</SPAN></P></PRE></DIV> <DIV> </DIV> <DIV>q里每一条命令都要求你输入密码,它就是在创徏证书myKeystore时设|的那个密码。至此,{֐证书部䆾完成了,下一步是创徏jnlp文g?/DIV> <DIV> </DIV> <H5>5、创建jnlp文g</H5> <DIV>Q?Q创Z个名为myswt.jnlp的jnlp文gQ这个文件是Java Web Start的核心配|文Ӟ其内容如下:</DIV> <DIV> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 113.7%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 332px; BACKGROUND-COLOR: #eeeeee"><PRE><?xml version="1.0" encoding="GBK"?><BR><jnlp codebase="<A href="http://localhost:8080/myswt">http://localhost:8080/myswt</A>"><BR> <information><BR>  <title>子在川曰(<A >http://blog.csdn.net/glchengang)</title</A>><BR>  <vendor>陈刚</vendor><BR>  <offline-allowed/><BR> </information><BR> <security><BR>  <all-permissions/><BR> </security><BR> <resources><BR>  <j2se version="1.4+"/><BR>  <jar href="myswt.jar"/><BR>  <jar href="lib/jface.jar"/><BR>  <jar href="lib/runtime.jar"/><BR>  <jar href="lib/swt.jar"/><BR>  <nativelib href="swt-win32-3063.jar"/><BR> </resources><BR> <application-desc main-class="jface.dialog.wizard.WizardDialog1"/><BR></jnlp><BR></PRE></DIV></DIV> <DIV> </DIV> <DIV>说明Q?/DIV> <UL> <LI>encoding="GBK"  本文选择了GBKQ一般来说应该用UTF-8。我在这里之所以选择GBK字符集,主要是ؓ了演C示例方便,如果是正式应用,q是应该改ؓUTF-8。如果用UTFQ?Q则该文件的中文要{换成UNICODE码,否则实际q行时将昄qQ你可以用c:\jdk\bin\native2ascii.exe来进行“汉字-QUNICODE”的转换? <LI>codebase="<A href="http://localhost:8080/myswt">http://localhost:8080/myswt</A>" 本应用程序的URL <LI><information>,是一些显CZ息,<title>?lt;vendor>都是必选的?lt;offline-allowed/>是可选的Q它表示允许应用E序脱机q行Q不和服务器联网Q? <LI><security>Ҏ指开攄h机的所有权限给应用E序Q这一会D弹出一个数字签名对话框? <LI><resources>列出了用户需要下载的资源?lt;j2se version="1.4+"/>是指Q要求用h机安装Java1.4以上版本?lt;nativelib>是指此包含有本地文gQ这时JWS下蝲后会此包解开? <LI><application-desc>指定了程序的入口c,你也可以指定其他的入口类Q它不受限制。jface.dialog.wizard.WizardDialog1是myswt.jar包中的一个向导式对话框,q是我自q写的一个SWTE序?/LI></UL> <P>Q?Q创Z个HTML|页Q网|向jnlp文g。我们给此HTML|页取名Qtest.htmlQ其内容如下Q?/P> <DIV> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 27px; BACKGROUND-COLOR: #eeeeee"><PRE><SPAN lang=EN-US><A HREF="myswt.jnlp"></SPAN><SPAN style="FONT-FAMILY: 'Courier New'">启动</SPAN><SPAN lang=EN-US></A></SPAN></PRE></DIV></DIV> <H5>6、最后效?/H5> <P>Q?Q最后的服务器的目录l构如下图所C:</P> <P><A target=_blank><IMG src="http://blog.sina.com.cn/pic/54bde01c0200003k" border=0></A></P> <P>Q?Q用览器浏览:<A href="http://localhost:8080/myswt/test.html">http://localhost:8080/myswt/test.html</A></P> <P><A target=_blank><IMG src="http://blog.sina.com.cn/pic/54bde01c0200003l" border=0></A></P> <P>单击“启动”后出现下图Q开始从服务器上下蝲SWT应用E序Q?/P> <P><A target=_blank><IMG src="http://blog.sina.com.cn/pic/54bde01c0200003m" border=0></A><A target=_blank></A></P> <P>下蝲完成后,出现如下图,提示用户是否向应用程序开放本机所有权限(弹出q个对话框是由jnlp文g中的<security>设|决定的Q?/P><A target=_blank><IMG src="http://blog.sina.com.cn/pic/54bde01c0200003n" border=0></A> <P>单击“启动”按钮,运行程序,出现下图。(附注Q这里没有弹出提CZd快捷菜单的对话框Q?/P> <P><A target=_blank><IMG src="http://blog.sina.com.cn/pic/54bde01c0200003o" border=0></A></P> <P> </P> <H5><SPAN lang=EN-US>7、其他注意事?/SPAN></H5> <P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">Q?/SPAN><SPAN lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体">Q如果单ȝ늚“启动”链接时Q显C的?/SPAN><SPAN lang=EN-US>jnlp</SPAN><SPAN style="FONT-FAMILY: 宋体">文g的内容,q非下蝲服务器的应用E序。这时你需要做如下查:</SPAN></P> <UL> <LI> <div id="wmqeeuq" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体"></SPAN><SPAN lang=EN-US style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings"><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">?/SPAN><SPAN lang=EN-US>Windows</SPAN><SPAN style="FONT-FAMILY: 宋体">中,</SPAN><SPAN lang=EN-US>jnlp</SPAN><SPAN style="FONT-FAMILY: 宋体">格式的文件应该默认用</SPAN><SPAN lang=EN-US>javaw</SPAN><SPAN style="FONT-FAMILY: 宋体">打开。如果你把它改变成了用记事本或其他程序打开Q就也会出错?/SPAN></DIV> <LI> <div id="wmqeeuq" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体"></SPAN><SPAN lang=EN-US>WEB</SPAN><SPAN style="FONT-FAMILY: 宋体">服务器是否能否L?/SPAN><SPAN lang=EN-US>jnlp</SPAN><SPAN style="FONT-FAMILY: 宋体">?/SPAN><SPAN lang=EN-US>jar</SPAN><SPAN style="FONT-FAMILY: 宋体">?/SPAN><SPAN lang=EN-US>class</SPAN><SPAN style="FONT-FAMILY: 宋体">文g的格式。如果你是用</SPAN><SPAN lang=EN-US>Tomcat</SPAN><SPAN style="FONT-FAMILY: 宋体">Q可以打开</SPAN><SPAN lang=EN-US>conf</SPAN><SPAN style="FONT-FAMILY: 宋体">目录?/SPAN><SPAN lang=EN-US>WEB.XML</SPAN><SPAN style="FONT-FAMILY: 宋体">文g查一下。一般来_较新?/SPAN><SPAN lang=EN-US>WEB</SPAN><SPAN style="FONT-FAMILY: 宋体">服务器都支持</SPAN><SPAN lang=EN-US>jnlp</SPAN><SPAN style="FONT-FAMILY: 宋体">Q如?/SPAN><SPAN lang=EN-US>Tomcat</SPAN><SPAN style="FONT-FAMILY: 宋体">?/SPAN><SPAN lang=EN-US>WebLogic</SPAN><SPAN style="FONT-FAMILY: 宋体">{(微Y?/SPAN><SPAN lang=EN-US>IIS</SPAN><SPAN style="FONT-FAMILY: 宋体">不支?/SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体">Q当然也不可能支?/SPAN><SPAN lang=EN-US>jnlp</SPAN><SPAN style="FONT-FAMILY: 宋体">Q我是这么想的没L试过Q。如果不支持Q就?/SPAN><SPAN lang=EN-US>WEB</SPAN><SPAN style="FONT-FAMILY: 宋体">服务器的配置文g里加上下面的内容?/SPAN></DIV></LI></UL><SPAN style="FONT-FAMILY: 宋体"> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 97.98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 272px; BACKGROUND-COLOR: #eeeeee"><PRE><mime-mapping><BR> <extension>class</extension><BR> <mime-type>application/java</mime-type><BR></mime-mapping></PRE><PRE><mime-mapping><BR> <extension>jar</extension><BR> <mime-type>application/java-archive</mime-type><BR></mime-mapping><BR> <BR><mime-mapping><BR> <extension>jnlp</extension><BR> <mime-type>application/x-java-jnlp-file</mime-type><BR></mime-mapping></PRE></DIV></SPAN> <P class=CharChar><SPAN style="FONT-FAMILY: 宋体"><SPAN style="FONT-FAMILY: 宋体">Q?/SPAN><SPAN lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋体">Q在使用</SPAN><SPAN lang=EN-US>Java Web Start</SPAN><SPAN style="FONT-FAMILY: 宋体">的时候可能会出现</SPAN><SPAN lang=EN-US>"</SPAN><SPAN style="FONT-FAMILY: 宋体">下蝲资源错误</SPAN><SPAN lang=EN-US>"</SPAN><SPAN style="FONT-FAMILY: 宋体">Q大致的出错信息如下Q?/SPAN></SPAN></P><SPAN style="FONT-FAMILY: 宋体"><SPAN style="FONT-FAMILY: 宋体"> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><PRE>JNLPException[category: Download Error : Exception:<BR>   java.io.IOException:<BR>   rename failed in cache : LaunchDesc: null ] at..... </PRE></DIV></SPAN></SPAN> <DIV> </DIV> <DIV>  q个错误的原因是因ؓ每次调用Java Web Start都会到server上查扄序是否更斎ͼ然后程序下载到本地的java web start目录下的cache目录中,如果cache中已l有同名文gQ而且该文件正在被使用Q那么新下蝲的文件就会出?rename failed错误Q而且手工d除本地的文gq会报错Q文件正被用!</DIV> <DIV> </DIV> <DIV>  q里涉及到Java Web Start中的sign机制Q可能对每个jar文g都需要标讎ͼ有的时候会在Q务管理器中看到javaw.exe在运行,该E序l止后就可以本地的jar文g删除掉,说明q些本地文g可能q保留着文g锁定吧!有时即ɞTask Manager中将所有的javaE序都kill掉还是会出错Q必要注销windows才可以,不知道是不是Java Web Start</DIV> <DIV> </DIV> <DIV>Q?Q如果需要给*.jar文g传递参敎ͼ可以用如下代码:</DIV> <DIV> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><PRE><application-desc main-class="XBFrame"/><BR> <argument>-port</argument><BR> <argument>1008</argument>  "注意-port?008是两个参敎ͼ要分开?BR></application-desc></PRE></DIV></DIV> <DIV> </DIV> <DIV>Q?Q有的时候还需要看?.jar中System.out.print语句输出的信息,p打开jws的consoleQ可以在jws manager 中的首选项中设|(附注Q(2Q、(3Q、(4Q照抄<Qjava web start实现关键问题(?Q>一文)</DIV> <DIV> </DIV> <DIV>Q?Q如果出现失败,最基本的查错手D就是看看出错的“详l信息”,如下图所C?/DIV> <DIV><A target=_blank><IMG src="http://blog.sina.com.cn/pic/54bde01c0200003p" border=0></A></DIV> <DIV> </DIV> <DIV>单击“详l信息”按钮,出现下图</DIV> <DIV><A target=_blank><IMG src="http://blog.sina.com.cn/pic/54bde01c0200003q" border=0></A></DIV> <DIV> </DIV> <H5>参考资?/H5> <DIV><A >http://www-900.ibm.com/developerWorks/cn/java/j-webstart/index.shtml</A></DIV> <DIV><A >http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-jws/index.shtml</A></DIV> <DIV><A >http://www-900.ibm.com/developerWorks/cn/java/l-webstart/index.shtml#author1</A></DIV> <DIV><A >http://dev.csdn.net/article/14/14216.shtm</A> 学用Java Web Start 部v应用E序</DIV> <DIV><A >http://ecolab.ruc.edu.cn/new/Article_Show.asp?ArticleID=80</A> 关于java的数字签?/DIV> <DIV><A >http://www.51one.net/info/3291681715538397.htm</A> java web start实现关键问题(?</DIV> <DIV> </DIV> <H5>作者简?/H5> <DIV>陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>您可以通过其博客了解更多信息和文章Q?A ><FONT color=#000033>http://www.chengang.com.cn</FONT></A></DIV><img src ="http://www.aygfsteel.com/chengang/aggbug/34076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chengang/" target="_blank">陈刚</a> 2006-03-07 14:52 <a href="http://www.aygfsteel.com/chengang/archive/2006/03/07/34076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在JAVA中如何检查字W串日期的合法?/title><link>http://www.aygfsteel.com/chengang/archive/2006/03/07/34067.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Tue, 07 Mar 2006 06:39:00 GMT</pubDate><guid>http://www.aygfsteel.com/chengang/archive/2006/03/07/34067.html</guid><wfw:comment>http://www.aygfsteel.com/chengang/comments/34067.html</wfw:comment><comments>http://www.aygfsteel.com/chengang/archive/2006/03/07/34067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chengang/comments/commentRss/34067.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chengang/services/trackbacks/34067.html</trackback:ping><description><![CDATA[?陈刚 from <A >www.chengang.com.cn</A> 2005-11-04 <BR><BR><BR> <DIV>  在SWT中还没有日期控gQ所以我的日期是用文本框手工输入的,q时需要验证输入的日期是否合法。在之前我是复制很久以前写的一D代码,它的解决Ҏ是分解日期字Ԍ然后查,q很W且不严根{正的Ҏ应该是利用DateFormatcL查,如下所C:<BR> <BR>public final class StringUtil {<BR>    private static Calendar calendar = Calendar.getInstance();<BR>    private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");<BR>    private static DateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<BR>    static {<BR>        dateFormat.setLenient(false);//q个的功能是不把1996-13-3 转换?997-1-3<BR>        dateTimeFormat.setLenient(false);<BR>    }<BR> <BR>    public static Date parseStringToDate(String dateStr) {<BR>        if (dateStr == null || dateStr.trim().equals(""))<BR>            return null;<BR>        dateStr = dateStr.trim(); <BR>        Date date = null;<BR>        try {<BR>            if (dateStr.length() <= 10) {<BR>                date = dateFormat.parse(dateStr);<BR>            } else {<BR>                date = dateTimeFormat.parse(dateStr);<BR>            }<BR>        } catch (Exception e) {<BR>            throw new IllegalArgumentException("你输入的日期不合法,请重新输?);<BR>        }<BR>        return date;<BR>    }<BR>}</DIV> <DIV><BR> <BR>q个Ҏ的Test Case也一q给出如下:<BR> <BR>public class TestStringUtil extends TestCase {<BR>    public void testParseStringToDate() {<BR>        {<BR>            Calendar c = Calendar.getInstance();<BR>            c.clear();<BR>            c.set(2000, 1, 3, 0, 0, 0);<BR>            Date d = StringUtil.parseStringToDate("2000-02-03");<BR>            assertEquals(c.getTime().getTime(), d.getTime());<BR>        }<BR>        {<BR>            Calendar c = Calendar.getInstance();<BR>            c.clear();<BR>            c.set(2000, 1, 3, 11, 22, 33);<BR>            Date d = StringUtil.parseStringToDate("2000-02-03 11:22:33");<BR>            assertEquals(c.getTime().getTime(), d.getTime());<BR>        }<BR>        {<BR>            Calendar c = Calendar.getInstance();<BR>            c.clear();<BR>            c.set(2000, 1, 3, 0, 0, 0);<BR>            Date d = StringUtil.parseStringToDate("2000-02-3");<BR>            assertEquals(c.getTime().getTime(), d.getTime());<BR>        }<BR>        {<BR>            Calendar c = Calendar.getInstance();<BR>            c.clear();<BR>            c.set(2000, 1, 3, 1, 2, 3);<BR>            Date d = StringUtil.parseStringToDate("2000-02-03 1:02:03");<BR>            assertEquals(c.getTime().getTime(), d.getTime());<BR>        }<BR>        {<BR>            assertNull(StringUtil.parseStringToDate(""));<BR>            assertNull(StringUtil.parseStringToDate("  "));<BR>            assertNull(StringUtil.parseStringToDate(null));<BR>        }<BR>    }<BR>    public void testParseStringToDateException() {<BR>        testParseStringToDateException("2000");<BR>        testParseStringToDateException("2000-13-03");<BR>        testParseStringToDateException("2000-02-03 51:02:03");<BR>        testParseStringToDateException("2000-02-03 01:f2:03");<BR>        testParseStringToDateException("2000-02-03 01:02");<BR>        testParseStringToDateException("2000-02-03 01:02:222");<BR>    }<BR>    private void testParseStringToDateException(String dateStr) {<BR>        try {<BR>            StringUtil.parseStringToDate(dateStr);<BR>            fail("末抛出异?);<BR>        } catch (Exception e) {<BR>            assertTrue(true);<BR>        }<BR>    }<BR>}<BR></DIV><img src ="http://www.aygfsteel.com/chengang/aggbug/34067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chengang/" target="_blank">陈刚</a> 2006-03-07 14:39 <a href="http://www.aygfsteel.com/chengang/archive/2006/03/07/34067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何删除JAVA集合中的元素http://www.aygfsteel.com/chengang/archive/2006/03/02/33195.html陈刚陈刚Thu, 02 Mar 2006 06:02:00 GMThttp://www.aygfsteel.com/chengang/archive/2006/03/02/33195.htmlhttp://www.aygfsteel.com/chengang/comments/33195.htmlhttp://www.aygfsteel.com/chengang/archive/2006/03/02/33195.html#Feedback0http://www.aygfsteel.com/chengang/comments/commentRss/33195.htmlhttp://www.aygfsteel.com/chengang/services/trackbacks/33195.html
l常我们要删除集合中的某些元素。有些可能会q么写?
   
  public void operate(List list){
        for (Iterator it = list.iterator(); it.hasNext();) {
            String str =  (String)it.next();
            if (str.equals("chengang")){
                list.remove(str);
            }
        }
    }
   
  q种写法一q行׃报如下异常:
 
Exception in thread "main" java.util.ConcurrentModificationException
 at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
 
  因ؓlist在@环中的时候是不可以删除它的元素的。后来我是这样做的,一U很W的ҎQ思\是这LQ创Z个List专门存放要被删除的元素,循环q后Q用List.removeAllҎ把元素删除。代码如下:
    public void operate(List list){
        List removeList= new ArrayList();
        for (Iterator it = list.iterator(); it.hasNext();) {
            String str =  (String)it.next();
            if (str.equals("chengang")){
                removeList.add(str);
            }
        }
        list.removeAll(removeList);
    }
 
  q样也确实可以解决问题了Q但是方法实在太W重Q其实可以有更简单的更高效的ҎQ就是用Iterator.removeҎQ如下:
        for (Iterator it = list.iterator(); it.hasNext();) {
            String str =  (String)it.next();
            if (str.equals("chengang")){
                it.remove();
            }
        }
 
 所以,你对Java的基知识了解多Q代码就会写得越z。相反如果你的代码特别复杂,则方法或设计一定有问题?/div>

陈刚 2006-03-02 14:02 发表评论
]]>JDK5.0新特性之Q其?/title><link>http://www.aygfsteel.com/chengang/archive/2006/03/02/33193.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Thu, 02 Mar 2006 05:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/chengang/archive/2006/03/02/33193.html</guid><wfw:comment>http://www.aygfsteel.com/chengang/comments/33193.html</wfw:comment><comments>http://www.aygfsteel.com/chengang/archive/2006/03/02/33193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chengang/comments/commentRss/33193.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chengang/services/trackbacks/33193.html</trackback:ping><description><![CDATA[<STRONG>?陈刚 2005-11-26</STRONG>  <BR><BR><STRONG>一、自动装׃拆箱</STRONG> <P>  q是一个很体帖的改q。在JDK5.0以前我们常看C面的代码?/P> <P>        Vector v=new Vector();<BR>        v.add(new Integer(1));</P> <P>  因ؓVector.add只接受对象,?不是对象Q所以我们还得把整数Q装到Integer对象里,真麻?( 。现在我们可以这样了Q是不是方便许多呢?如下Q?/P> <P>        Vector<Integer> v=new Vector<Integer>(1);<BR>        v.add(1);<BR></P> <P><STRONG>二、新的for循环</STRONG></P> <P>  在前面讲枚D的时候已l用CQ再把进面的代码_脓一ơ吧Q如下:</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>        Color[] colors = Color.values();<BR>        for (Color c : colors) {<BR>            System.out.println("color value=" + c.getColorValue());<BR>        }</PRE></DIV> <P>  注意Q不要以为Color[]是数l,׃为for-each循环只适用于数l,对于集合QList、Set)一样可以的Q如下:</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>        List<String> list = new ArrayList<String>();<BR>        for (String str : list) {<BR>            System.out.println(str);<BR>        }<BR></PRE></DIV> <P></P> <P><STRONG>三、参C数的可变?/STRONG></P> <P>  参数的个数是可变的,如下代码中的testҎ是一个int型的可变参数Q当然你可以参数设成String、Object{?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>public class Test {<BR>    public static void main(String[] args) {<BR>        test();<BR>        test(1);<BR>        test(2, 3, 4);<BR>    }</PRE><PRE>    public static void test(int... ints) {<BR>        for (int i : ints) {<BR>            System.out.println(i);<BR>        }<BR>    }<BR>}</PRE></DIV> <P><STRONG>四、静态引?/STRONG></P> <P>  什么是静态引用,先看下面的代码:</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>package jdk5;<BR>public class Model {<BR>    public static void operate() {}<BR>    public static String ABC;<BR>}</PRE></DIV> <P>ModelcL一个静态方法operate和一个静态变量(必须是静态的Q,q是一个很普通的cR而下面的Testcd有些奇怪了Q?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>package jdk5;</PRE><PRE>import static jdk5.Model.ABC;<BR>import static jdk5.Model.operate;</PRE><PRE>public class Test {<BR>    public static void test() {<BR>        operate();<BR>        String s = ABC;<BR>    }<BR>}</PRE></DIV> <P>有那些奇怪的地方呢?</P> <P>Q1Qimport 后面多了一个static<BR>Q2Qjdk5.Model后面多写了方法operate和变量ABC</P> <P>  有了上面奇怪的写法之后Q以后在TestcM要用import static的方法、变量就可以象本地方法和变量一L了?/P> <P></P> <P><STRONG>五、C风格格式化输?/STRONG></P> <P>  以前我们在这里写代码Q?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>    public static void main(String[] args) {<BR>        int x = 10;<BR>        int y = 20;<BR>        int sum = x + y;<BR>        System.out.printf(x + " + " + y + " = " + sum);<BR>    }</PRE></DIV> <P>  在JDK5.0后,我们q样写代码:</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>    public static void main(String[] args) {<BR>        int x = 10;<BR>        int y = 20;<BR>        int sum = x + y;<BR>        System.out.printf("%d + %d = %d", x, y, sum);<BR>    }</PRE></DIV> <P>  两段代码的效果都是一L?0 + 20 = 30”,但第二种C风格的写法显C方便易d了?/P> <P></P> <P><STRONG>六、元数据Q注解)</STRONG></P> <P>  q是JDK5.0学XDoclt的,有了注解Q以后我们可以不必写接口QEJB写v来会方便很多。EJB3.0要精写法Q注解要占一些功功?/P> <P>  介绍一个常用的注解Q@OverrideQ示例如下:</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>public class Test extends ATest{<BR> <BR> @Override<BR>    public void test() {<BR>    }<BR>}</PRE></DIV> <P> 在方法前加了q个注解Q就限定MTest的这个方法一定要是覆盖自ATest的方法testQ否则就会报错。比如你不心把方法test()写成了tesd()Q编译时׃报错。另一个要注意的是@Override用于定义覆盖接口的方法,也就是说ATest必须是一个抽象类、普通类Q但不能是接口?/P> <P>   另一个常见到的注解是@DeprecatedQ表明该(cR字Dc方法)不再被推荐用。不q我们自׃般很用到这个注解?/P> <P>  好了Q注解只讲这两个吧,也不必了解太多,知道个概念,以后用到的时候再说吧。关于注解,看看XDocltQ这是一个开源小工具Q在目开发中非常好用?/P> <P><STRONG></STRONG></P> <P><STRONG>作者简?/STRONG></P> <P>陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>您可以通过其博客了解更多信息和文章Q?A ><FONT color=#000033>http://www.chengang.com.cn</FONT></A> </P><img src ="http://www.aygfsteel.com/chengang/aggbug/33193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chengang/" target="_blank">陈刚</a> 2006-03-02 13:59 <a href="http://www.aygfsteel.com/chengang/archive/2006/03/02/33193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK5.0新特性之Q泛?/title><link>http://www.aygfsteel.com/chengang/archive/2006/03/02/33191.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Thu, 02 Mar 2006 05:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/chengang/archive/2006/03/02/33191.html</guid><wfw:comment>http://www.aygfsteel.com/chengang/comments/33191.html</wfw:comment><comments>http://www.aygfsteel.com/chengang/archive/2006/03/02/33191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chengang/comments/commentRss/33191.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chengang/services/trackbacks/33191.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class=item-content> <P><STRONG>?陈刚 2005-11-09 <BR><BR>一、前a</STRONG></P> <P>  泛型q个词在现在的JAVA挺时髦,光从字面上你是无法知道它代表些什么东东的Q所以我们还是不要从字面ȝ解,而是从一些实例去了解它吧?/P> <P><STRONG>二、泛型之前的日子</STRONG></P> <P>  QDQ1.4之前是没有泛型的概念的,所以我们才会有下面的代?</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE> List list = new ArrayList();<BR> list.add("aaaa");<BR> list.add("bbbb");<BR> list.add("cccc");</PRE><PRE> for (Iterator it = list.iterator(); it.hasNext();) {<BR> String str = (String) it.next();<BR> System.out.println(str);<BR> }</PRE></DIV> <P>  上面是一D很q_的代码,在一个List集合加入一些字W串Q然后再用一个遍历@环把它打印出来。“String str = (String) it.next()”这一句我们可以看到List取出值都是ObjectQ所以我们要得String型,q要做一个类型{换,真是ȝ。更ȝ的是list.add(Object obj)的参数是ObjectcdQ所以如果我们一不小心把list.add("cccc");写成list.add(new Integer(76));E序在@环打印的cd转换中就会出错?/P> <P>  问题Q我们能不能让addҎ只认String型呢Q?BR>  回答Q可以!用JDK5.0的泛型?/P> <P><STRONG>三、泛型后的幸生z?/STRONG></P> <P>  JAVA有了泛型后,p十年的老光讨了老婆Q那个好处自不待a。我们来看看上面的例子改成泛型的写法是怎么LQ?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE> List<String> list = new ArrayList<String>();<BR> list.add("aaaa");<BR> list.add("bbbb");<BR> list.add("cccc");</PRE><PRE> for (Iterator<String> it = list.iterator(); it.hasNext();) {<BR> String str=it.next();<BR> System.out.println(str);<BR> }</PRE></DIV> <P>  看到差别了吗Q泛型其实很单,是在定义类型的后面加上"<cd>"q样子的声明p了,它主要还有以下差别:</P> <UL> <LI>list.addҎ只能接受Stringcd。list.add(new Integer(76))q样的语句不需要运行程序,在编译时׃查通不q? <LI>it.next()的返回g再是ObjectQ而变成了String</LI></UL> <P>  当然我们其实在@环部份也可以象下面这么写Q是不是z了很多?:-)</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE> List<String> list = new ArrayList<String>();<BR> list.add("aaaa");<BR> list.add("bbbb");<BR> list.add("cccc");</PRE><PRE> for (String str : list) {<BR> System.out.println(str);<BR> }</PRE></DIV> <P>  当然需要说明的是,List不仅可以List<String>Q也可以是List<Integer>{等其他Mcd?/P> <P><STRONG>四、更深入了解泛型</STRONG></P> <P>Q1Q层层推q的泛型声明</P> <P>  “List<List> list;”表CZ么呢Q就是只接收List型的参数Q比如:</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>        List<List> list = new ArrayList<List>();<BR>        list.add(new ArrayList());<BR>        list.add(new Vector());<BR>        list.add(new LinkedList());</PRE></DIV> <P>  q里要注意List是接口,ArrayList、Vector、LinkedList都是q一接口下的实现cR下面这个有Ҏ异了,“List<List<String>> list;”表C它只接受List型的参数Q而且q种List型的参数又是只是只接受String型,有点层层推进的味道在里面了?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>        List<List<String>> list = new ArrayList<List<String>>();<BR>        list.add(new ArrayList<String>());<BR>        list.add(new Vector<String>());<BR>        list.add(new LinkedList<String>());</PRE></DIV> <P><STRIKE></STRIKE></P> <P></P> <P></P> <P>Q2Q用泛型上限通通配W:extends </P> <P>  q里要着重强调一点:变量的泛型声明和Ҏ的参数的泛型声明有很大差别?/P> <P>  变量声明成某cdQ同时也可以接受它的子类。比如说Integer、Long、Float都是抽象cNumber的子c,所以下面的代码一炚w题也没有Q?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>        List<Number> list = new ArrayList<Number>();<BR>        list.add(new Integer(1));<BR>        list.add(new Long(1));<BR>        list.add(new Float(1.2));<BR></PRE></DIV> <P>  但如果换成方法参数的泛型声明则要严格得多了:子类也是不行的。比如下面的代码是<STRONG><FONT color=#ff0000>错误</FONT></STRONG>的,因ؓprintList参数只接受Number值的ListQ就是是Number子类的Integer值的List也不行?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>    public static void main(String[] args) {<BR>        List<Integer> list = new ArrayList<Integer>();<BR>        list.add(new Integer(1));<BR>        list.add(new Integer(2));<BR>        printList(list);<BR>    }<BR>    <BR>    private static void printList(List<Number> list){<BR>        for (Number num : list) {<BR>            System.out.println(num);<BR>        }<BR>    }<BR></PRE></DIV> <P> 上面代码修改的方法有两个Q如?/P> <P>修改Ҏ一Q改变量的泛型声?BR>   List<Integer> list = new ArrayList<Integer>();<BR>  改ؓ List<Number> list = new ArrayList<Number>();</P> <P>修改Ҏ二:用界限通配W改Ҏ参数的泛型声?BR>   printList(List<Number> list)<BR>  改ؓ printList(List<? extends Number> list)<BR>  说明Qextends 的含义就是表C参数可以接受Number型的子类?/P> <P></P> <P>Q3Q用泛型下限通通配W:super </P> <P>    在上限就有下限,下限行就是superQ用法和extends一P含义则和extends相反。比如printList(List<? super Integer> list)表示参数可以接受Integer型及Integer型的类Q即Number了,当然也包括Objectq个cR?/P> <P>Q4Q配|符Q?</P> <P>  Q表C可以接受Q何类型,不过我觉得它用得不多Q因为printList(List<?> list)和printList(List list)的作用是一L?/P> <P></P> <P><STRONG>五、创Z个支持泛型的c?/STRONG></P> <P>Q1Q创Z个泛型的c?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>public class Point<T> {<BR>    T x;<BR>    T y;</PRE><PRE>    public T getX() {<BR>        return x;<BR>    }</PRE><PRE>    public T getY() {<BR>        return y;<BR>    }</PRE><PRE>    public void setX(T x) {<BR>        this.x = x;<BR>    }</PRE><PRE>    public void setY(T y) {<BR>        this.y = y;<BR>    }<BR>}</PRE></DIV> <P>  使用q个cȝ代码如下Q?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>        Point<Integer> p = new Point<Integer>();<BR>        p.setX(new Integer(1));<BR>        p.setY(new Integer(2));<BR>        <BR>        Point<String> b = new Point<String>();<BR>        b.setX("1");<BR>        b.setY("2");</PRE></DIV> <P>  说明Q在Point<T>的定义中QTq关键字,你也可以q样定义Point<ABC>Q当然一般还是写T吧,单也规范?/P> <P>Q2Q泛型类的承与实现</P> <P>  java.util.ComparatorcLJDK里用来排序的Q其源代码如下:</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 85px"><PRE>package java.util;<BR>public interface Comparator<T> {<BR>    int compare(T o1, T o2);<BR>    boolean equals(Object obj);<BR>}</PRE></DIV> <P>   一个实现此接口的类如下Q?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 85px"><PRE>    public class MyComparator<T> implements Comparator<ObjectInstance> {<BR>        public int compare(ObjectInstance o1, ObjectInstance o2) {<BR>            String s1 = o1.getObjectName().getCanonicalName();<BR>            String s2 = o2.getObjectName().getCanonicalName();<BR>            return s1.compareToIgnoreCase(s2);<BR>        }<BR>    }</PRE></DIV> <P>  说明QObjectInstance可能大家q太明白Q这是我实际目中的一D代码(关于Q݋Q的Q,ObjectInstance全称javax.management.ObjectInstance。MyComparator的用代码如下:</P> <P></P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px">Set set = ......Q省略)<BR>List<ObjectInstance> mbeans = new ArrayList<ObjectInstance>(set);<BR>Collections.sort(mbeans, new MyComparator<ObjectInstance>());<BR></DIV> <P></P> <P><STRONG>六、最后的感言</STRONG></P> <P>  JAVA有了泛型p老光讨了老婆Q好处大大的Q但和女Z样麻烦也跟着来了Q它的严格类型检查,佉K藏的QUQ更。有些地方确实也使代码简z了Q有些地方却会得代码更复杂。所以运用之妙在于是否用得适当Q尽量把泛型往单里用,别越搞越复杂了?nbsp;</P> <P><STRONG>参考资?/STRONG></P> <P>J2SE 5.0中的泛型 <A >http://www.matrix.org.cn/resource/article/43/43634_java_generics.html</A> </P> <H5><FONT size=3>作者简?/FONT></H5> <P>陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>您可以通过其博客了解更多信息和文章Q?A ><FONT color=#000033>http://www.ChenGang.com.cn</FONT></A> </P> <div id="wmqeeuq" class=clear></DIV></DIV><img src ="http://www.aygfsteel.com/chengang/aggbug/33191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chengang/" target="_blank">陈刚</a> 2006-03-02 13:55 <a href="http://www.aygfsteel.com/chengang/archive/2006/03/02/33191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK5.0新特性之Q枚?/title><link>http://www.aygfsteel.com/chengang/archive/2006/03/02/33189.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Thu, 02 Mar 2006 05:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/chengang/archive/2006/03/02/33189.html</guid><wfw:comment>http://www.aygfsteel.com/chengang/comments/33189.html</wfw:comment><comments>http://www.aygfsteel.com/chengang/archive/2006/03/02/33189.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chengang/comments/commentRss/33189.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chengang/services/trackbacks/33189.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class=item-content> <P></P> <P><STRONG>?陈刚 2005-11-09 <BR><BR>一、前a</STRONG></P> <P>  JDK5.0出来有快一q了吧,泛泛的浏览过一些资料,不知道是文章写得生ӆQ还是我愚笨QM是没太明白。反正所做的目也没有用刎ͼ所以放在了一辏V近来公司^台升U到JBOSS4和JDK5Q看来要仔佃看它一看看。上|搜索了一些资料,׃两小旉读,明白了一些,好象也不是很难。现心得和理解l集成文Q以便后来者?/P> <P>  JDK5.0主要有哪些新Ҏ呢Q如下列?/P> <UL> <LI>泛型 <LI>增强的for循环 <LI>自动装箱和自动拆? <LI>cd安全的枚? <LI>可变长度参数 <LI>静态引? <LI>元数据(注解Q? <LI>C风格的格式化输出 </LI></UL> <P>  本文先讲“类型安全的枚D”?/P> <P><STRONG>二、旧的历?/STRONG></P> <P>  举个例:有一个如下的“花(flower)”类Q它有一个颜?color)属性,用int型来表示光艌Ӏ?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>public class Flower {<BR>    private int color;</PRE><PRE>    public void setColor(int color) {<BR>        this.color = color;<BR>    }<BR>    <BR>    public int getColor(){<BR>        return color;<BR>    }<BR>}</PRE></DIV> <P>  q时一般我们会创徏一个常量类Q来存放颜色帔RQ如下:</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>public interface Color {<BR>    int RED = 0;<BR>    int BLACK = 1;<BR>    int YELLOW = 2;<BR>    int BLUE = 3;<BR>    int WHITE = 4;<BR>    int ORANGE = 5;<BR>}</PRE></DIV> <P>  以后我们用的时候就可以q样Q?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>public class Client {<BR>    public static void main(String[] args) {<BR>        Flower f = new Flower();<BR>        f.setColor(Color.RED);<BR>    }<BR>}</PRE></DIV> <P>  Colorcd是一个我们自己来实现的枚丄Q当然它q不是严格意义上的枚丄Q而且JDK5.0之前q没有枚举。这时会出现一个问题:setColor参数是int型,那么也许用户会不心用一个非法的intDq去Q这样就可能产生BUGQ如Qf.setColor(100);昄100q是我们设定中的颜色倹{?/P> <P>  在那本有名的java著作<<Effective java>> Joshua BlochQ用了专门的一章(W5章)来讨个问题,书中l出了一个比较严谨的解决ҎQ如下代码所C?/P> <P>Q1Q用ColorcL改如下:</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>public class Color {<BR>    private final int color;</PRE><PRE>    private Color(int color) {<BR>        this.color = color;<BR>    }</PRE><PRE>    public int getColorValue() {<BR>        return color;<BR>    }</PRE><PRE>    public static final Color RED = new Color(0);<BR>    public static final Color BLACK = new Color(1);<BR>    public static final Color YELLOW = new Color(2);<BR>    public static final Color BLUE = new Color(3);<BR>    public static final Color WHITE = new Color(4);<BR>    public static final Color ORANGE = new Color(5);<BR>}</PRE></DIV> <P></P> <P>Q2QFlowercM要相应的更改Q将int改ؓColor型?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>public class Flower {<BR>    private Color color;</PRE><PRE>    public void setColor(Color color) {<BR>        this.color = color;<BR>    }</PRE><PRE>    public Color getColor() {<BR>        return color;<BR>    }<BR>}</PRE></DIV> <P>Q3Q客LClient不用修改?/P> <P>  q样FlowercȝsetColorҎ只接收ColorQ也不用担心用户不心传入非法的参数g?/P> <P></P> <P><STRONG>三、新的特性:JDK5.0枚D</STRONG></P> <P>Q1Q简单的例子</P> <P>  JDK5.0的枚举,正好可以解决上面我们讨论的问题,而且更简z。还是用上面的代码做CZQ只需要将ColorcM改如下,Flower、Client都无法更攏V?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>public enum Color {<BR>    RED, BLACK, YELLOW, BLUE, WHITE, ORANGE<BR>}</PRE></DIV> <P> 很简单吧。接下来我们做更׃步的说明Q?/P> <UL> <LI>所有枚丄都是java.lang.Enum的子c(JDK内核自动Color隐性承自EnumQ? <LI>RED...ORANGE都是Color的实例对?/LI></UL> <P> 上面的Color枚Dc,功能好象q和以前的例子不完全一P我们再次修改如下?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>public enum Color {<BR>    RED(0), BLACK(1), YELLOW(2), BLUE(3), WHITE(4), ORANGE(5);<BR>    <BR>    int color;<BR>    Color(int color){<BR>        this.color=color;<BR>    }<BR>    <BR>    public int getColorValue(){<BR>        return color;<BR>    }<BR>}<BR></PRE></DIV> <P>  从这里我们可以看到枚丄是如何创建构造函数及Ҏ的,有一些隐性的东西要说明一下:</P> <UL> <LI>枚Dcȝ构造函数要求是private的,如果象例子里那样不加修饰W,则Java会自动给加上。但如果你想加上public则会报错? <LI>RED(0), BLACK(1)...{枚丑ր必d义在前面Q而且最后一个枚丑րORANGE(5);未尾用分L束?/LI></UL> <P>Q2Q在循环中用枚丄</P> <P>  枚Dc都有一个valuesҎ可以得到它值的数组QColor[] colors=Color.values();而且枚Dc都支持泛型Q以后的文章会重点说刎ͼQ所以我们可以这h遍历q个数组Q?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>        Color[] colors = Color.values();<BR>        for (Color c : colors) {<BR>            System.out.println("color value=" + c.getColorValue());<BR>        }</PRE></DIV> <P>更简z的写法是这P</P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>        for (Color c : Color.values()) {<BR>            System.out.println("color value=" + c.getColorValue());<BR>        }</PRE></DIV> <P>Q3Q在switchQ分支)中用枚?/P> <P>  如下代码CZQ这里要注意“case RED:”写成“case Color.RED:”是会报错的Q因为JDK5.0可以自动Ҏ“switch (color)”就判断入你要用什么枚丄型了。从q里也可以看出JDK5.0实为用户做了帖心的考虑Q尽量让E序员少写代码,写更单的代码?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>        Color color = Color.RED;<BR>        switch (color) {<BR>        case RED:<BR>            //process ... <BR>            break;<BR>        case BLACK:<BR>            //process ...<BR>            break;<BR>        case WHITE:<BR>            //process ...<BR>            break;<BR>        default:<BR>            //process ...<BR>        }</PRE></DIV> <P>Q4QJDK5.0新增的集合:EnumMap 和EnumSet </P> <P>  l出两个例子Q一切尽在不a中了。(说明Q这两个例子用到了JDK5.0中泛型的知识Q?/P> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>        Map<Color, String> map = new EnumMap<Color, String>(Color.class);<BR>        map.put(Color.RED, "U色");<BR>        map.put(Color.BLACK, "黑色");<BR>        map.put(Color.WHITE, "白色");<BR>        <BR>        for (Color c : Color.values()) {<BR>            System.out.println(c + " chinese is: " + map.get(c));<BR>        }</PRE></DIV><BR> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>        Set all = EnumSet.allOf(Color.class);<BR>        EnumSet warmColors = EnumSet.of(Color.RED, Color.YELLOW);<BR>        Set notWarmColors = EnumSet.complementOf(warmColors);<BR>        Set notBlack = EnumSet.range(Color.RED, Color.YELLOW);<BR></PRE></DIV> <P><STRONG></STRONG></P> <P><STRONG>四、参考资?/STRONG></P> <P><A >http://dev.yesky.com/451/2044451_1.shtml</A></P> <H5><FONT size=3>五、作者简?/FONT></H5> <P>陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>您可以通过其博客了解更多信息和文章Q?A ><FONT color=#000033>http://www.ChenGang.com.cn</FONT></A> </P> <P></P> <P></P> <P></P> <P><STRIKE></STRIKE></P> <div id="wmqeeuq" class=clear></DIV></DIV><img src ="http://www.aygfsteel.com/chengang/aggbug/33189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chengang/" target="_blank">陈刚</a> 2006-03-02 13:53 <a href="http://www.aygfsteel.com/chengang/archive/2006/03/02/33189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank">㽭ʡ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¦</a>| <a href="http://" target="_blank">տ</a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ٰ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ƥ</a>| <a href="http://" target="_blank">տ</a>| <a href="http://" target="_blank">ӽ</a>| <a href="http://" target="_blank">Ұ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯׯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">׺</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>