ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>精品国产一区二区国模嫣然,亚洲日本精品一区,日韩aaaahttp://www.aygfsteel.com/ideame/category/36841.htmlé?r¨´n)而思之zh-cnWed, 03 Aug 2016 09:58:28 GMTWed, 03 Aug 2016 09:58:28 GMT60IntelliJ IDEA插äšg开发手å†?/title><link>http://www.aygfsteel.com/ideame/archive/2008/10/17/234974.html</link><dc:creator>ideame</dc:creator><author>ideame</author><pubDate>Fri, 17 Oct 2008 09:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/ideame/archive/2008/10/17/234974.html</guid><wfw:comment>http://www.aygfsteel.com/ideame/comments/234974.html</wfw:comment><comments>http://www.aygfsteel.com/ideame/archive/2008/10/17/234974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ideame/comments/commentRss/234974.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ideame/services/trackbacks/234974.html</trackback:ping><description><![CDATA[ <li> <div id="wmqeeuq" class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9fb9c071-df53-4613-90da-1f80a4ecbd3b" style="margin: 0px; padding: 0px; display: inline;">Technorati 标签: <a rel="tag">IntelliJ IDEA 插äšg</a></div> <h4>来自åQ?a >中国¾|‘站资源</a> 作者:(x¨¬)<a >lybykw</a></h4> </li> <li> <h4>  开发准å¤?</h4> <h4> <hr /> </h4> <p>   在开发前åQŒé¦–先我们要做一些环境准备,˜q™æ ·ä½ å¯ä»¥å¿«é€Ÿè¿›å…¥è¿™ä¸ªåœºæ™¯ã€‚首先你要安装好IntelliJ IDEAåQŒè¿™é‡Œæˆ‘推荐大家使用IntelliJ IDEA 7.0 M2åQŒä½ å¯ä»¥é€šè¿‡<a >http://www.jetbrains.com/idea</a><a >下蝲</a>。IntelliJ IDEA安装完毕后,你需要安装一个插件开发包åQŒä¸»è¦ç”¨äºŽIntelliJ IDEA的插件开发ã€?a >下蝲</a>地址和IntelliJ IDEA相同ã€?˜q™ä¸ªå¼€å‘包包含以下内容åQšIntelliJ IDEAçš„Open API和源码,以及(qi¨¢ng)一些插件的源码åQˆIntelliJ IDEA的插件源码都åœ?<a >http://svn.jetbrains.org/idea/Trunk</a>åQŒè¿™äº›éƒ½æ˜¯ä½ ¾~–写插äšg的很好样例)(j¨ª)。当然没有这个插件开发包你可以开发插ä»Óž¼Œä¸è¿‡æˆ‘强烈推è?a >下蝲</a>˜q™ä¸ªå¼€å‘包。开发部<a >下蝲</a>完毕后,你需要将其解压到IntelliJ IDEA的安装目录下åQŒè¿™æ ·IntelliJ IDEAçš„SDK创徏ä¼?x¨¬)很½Ž€å•。这里要注意一点,插äšg开发包的版本最好和IntelliJ IDEA的版本相对应。关于IntelliJ IDEAçš„SDK准备åQŒä½ å¯ä»¥å‚考这½‹‡æ–‡ç« ï¼š(x¨¬)<a >建立IntelliJ IDEA插äšg开发环å¢?/a> ã€? <br />   接下来我们启动IntelliJ IDEA来创å»ÞZ¸€ä¸ªIntelliJ IDEA SDKåQŒè¿™æ˜¯å¼€å‘插件的基础。启动IDEAåQŒæ‰“开讄¡½®é¢æ¿åQŒé€‰æ‹©â€Project Settings"åQŒåœ¨å¼¹å‡ºçš„对话框中安装下图进行IntelliJ IDEA SDK讄¡½®åQ?/p> <p> </p> <p>˜q™é‡Œè¦æœ‰ä¸€ä¸ªæ³¨æ„äº‹™å¹ï¼š(x¨¬)默认的情况下åQŒæ–°åˆ›å¾çš„SDKòq¶ä¼š(x¨¬)ž®†idea.jar包含到classpath中,ç”׃ºŽIntelliJ IDEAçš„Open API不能完全满èƒö你需要的功能åQŒä½ çš„æ’件可能会(x¨¬)用到IDEA未公布的APIåQŒæ‰€ä»¥è¿™é‡Œå¾è®®ä½ ‹‚€(g¨¨)查一下idea.jaræ–‡äšg是否已经被包含,如果没有被包含,请加入这个jaræ–‡äšgã€? <br />    IntelliJ IDEAçš„SDK已经被创å»ÞZº†(ji¨£n)åQŒå®ƒæ˜¯å¼€å‘插件的基础包。在˜q™é‡Œæˆ‘相对这些jaræ–‡äšg˜q›è¡Œä¸€äº›æ˜qŽÍ¼Œå·²æ–¹ä¾¿æˆ‘们以后的代码¾~–写åQŒæ¯•竟我们代码是要引用其他的开发包的,如果IDEA已经提供åQŒæˆ‘们就没有必要在找½W¬ä¸‰æ–¹çš„jar包啦。在$IDEA_HOME/lib下有以下文äšg需要提一下:(x¨¬) <br />      commons-codec-1.3.jaråQšè¿™ä¸ªæ˜¯˜q›è¡Œ¾~–码转换的开发包åQŒæ˜¯Apache Commons一个比较重要的开发包åQ?<a >http://commons.apache.org/codec</a><br />      commons-collections.jaråQ?Java Collection扩展框架åQŒå¯¹Collection处理更加方便åQŒä¹Ÿæ˜¯Apache Commons一个比较重要的开发包åQ›Â?<a >http://commons.apache.org/collections/</a><br />      j2ee.jarå’Œjavaee.jaråQšJ2EE开发包åQŒè¿™ä¸ªä¸ç”¨è¯´å•¦ï¼› <a >http://java.sun.com/javaee/5/docs/api/</a><br />      jdom.jaråQšXML开发包åQ?<a >http://www.jdom.org</a><br />      trove4j.jar: java.util.Collections的一个实玎ͼŒæ›´åŠ å¿«é€Ÿã€è½»é‡ï¼› <a >http://trove4j.sourceforge.net/</a><br />      velocity.jar: Velocity模板引擎åQ?<a >http://velocity.apache.org</a><br />      xmlrpc-2.0.jar: xml-rpc的开发包åQ?<a >http://ws.apache.org/xmlrpc/</a><br />      xstream.jar: xml/object映射框架åQ?<a >http://xstream.codehaus.org/</a><br />   äº?ji¨£n)解一下这些开发包åQŒå¯èƒ½å¯¹åŽç®‹çš„开发有不少的帮助ã€? <br />   下面ž®Þp®©æˆ‘们开始创å»ÞZ¸€ä¸ªé¡¹ç›®åƈ˜q›è¡Œæ’äšg开发。首先我们要创徏一个项目,˜q™é‡Œä¸ªäh有一个徏议:(x¨¬)建立一个空的项目,然后æ·ÕdŠ å¤šä¸ªplugin moduleåQŒè¿™æ ·åœ¨ä¸€ä¸ªé¡¹ç›®ä¸­å¯ä»¥åŒ…含多个plugin moduleåQŒä¸»è¦çš„好处ž®±æ˜¯ä½ å¯ä»¥æ·»åŠ ä¸€äº›å‚è€ƒçš„æ’äšgåQŒè¿™å¯¹ç¼–写一个新的插件会(x¨¬)帮助不少ã€? <br /></p> <p>™å¹ç›®åˆ›å¾åŽï¼Œæˆ‘们需要添加一个plugin module。只需打开"File" -> "Add Module"然后选择"plugin module"ž®±å¯ä»¥å•¦åQŒè¯·ž®†moduleçš„SDK讄¡½®ä¸ÞZ¸Šé¢æˆ‘们创建的IDEA SDK。到˜q™é‡Œæ’äšg开发的™å¹ç›®ž®±åˆ›å»ºå®Œæ¯•啦åQŒä½ å¯ä»¥å¼€å‘你的插件啦ã€?</p> <p> <img src="http://docs.google.com/File?id=dc73pj2h_33gv9zn2d8" /> </p> </li> <li> <h4>IntelliJ IDEAçš„IoC介绍 </h4> <h4> <hr /> </h4> <p>    当你看到˜q™ä¸€ç« èŠ‚æ—Óž¼Œä½ ä¼°è®¡ä¼š(x¨¬)骂我鸡婆。IoCåQŒè¿™ä¸ªè¿˜è¦ä½ æ¥å‘Šè¯‰æˆ‘åQŒæˆ‘用SpringFramework已经很久啦。但我还是要说一下。IDEA整个¾l„äšg¾l“构是基于PicoContaineråQ?a >http://www.picocontainer.org</a>)的,PicoContainer是一个高效的嵌入式的DI容器。如果你有时间的话,我徏议你èŠ?分钟‹¹è§ˆä¸€ä¸‹PicoContaineråQŒç„¶åŽå›žåˆ°è¿™½‹‡æ–‡æ¡£æ¥ã€? <br />    PicoContainer是有层次¾l“构的,ž®±æ˜¯ä¸€ä¸ªcontainer可以包含子containeråQŒå­å®¹å™¨å¯ä»¥è®‰K—®çˆ¶å®¹å™¨ä¸­çš„组ä»Óž¼Œè€Œå„个子容器直接是独立的。在IDEA中,主要有三¿UcontaineråQšApplication, Projectå’ŒModuleåQŒåˆ†åˆ«åŒ…含不同的¾l„äšg。application container包含多个project containeråQŒproject container可以包含多个module containeråQŒå¦‚下图åQ? <br /><img src="http://docs.google.com/File?id=dc73pj2h_34cmd3ttfp" /></p> <p>    ˜q™æ ·å„个project container是独立的åQŒéƒ½å¯ä»¥è®‰K—®a(ch¨£n)pplication container中的¾l„äšgåQ›module container也是独立的,可以讉K—®æ‰€å±žproject containerå’Œapplication container中的¾l„äšg。这个图是我们后面理解application component, project component, module componentå’Œextension point½{‰ç­‰çš„基¼‹€ã€? <br />    PicoContainer的组件注入主要有两种方式:构造注入和Setter注入åQŒä½†æ˜¯åœ¨IDEA中,目前Setter注入˜q˜ä¸æ”¯æŒåQŒå…¨éƒ¨æ˜¯æž„造注入,关于构造注入,PicoContainer推荐最好ä‹É用一个构造函敎ͼŒ˜q™ç‚¹ä¹Ÿåœ¨IDEA中需要明¼‹®ã€‚如果你的组仉™œ€è¦å¼•用其他的¾l„äšgæˆ?a >资源</a>åQŒä½ æœ€å¥½åœ¨¾l„äšg的构造函æ•îC¸­æŒ‡å®šåQŒPicoContainerä¼?x¨¬)帮助你完成资源引用和初始化ã€? <br />   IDEA的这些容器中包含些什么? 当然首先是各¿UcomponentåQŒè¿˜æœ‰å°±æ˜¯ä¸€äº›æœåŠ¡ï¼Œå®¹å™¨ä¸­ä¸ä»…ä»…æ˜¯componentåQŒè¿˜æœ‰ç›¸å…³äØ“(f¨´)¾l„äšg服务的资源,在后面我们也ä¼?x¨¬)涉及(qi¨¢ng)到对容器中服务资源的讲˜q°ã€‚Â?<br />   如果讉K—®˜q™äº›å®¹å™¨ä¸­çš„¾l„äšgåQŸåœ¨IDEA中,讉K—®a(ch¨£n)pplication container中的¾l„äšg可以通过ApplicationManager.getInstance().getComponent(Class T)来进行。通用获得project对象后,你可以访问project容器中的¾l„äšgåQ›èŽ·å–module对象后,你可以访问module容器的组件。有äº?ji¨£n)容器后åQŒå¦‚何能获取指定的组ä»Óž¼Ÿæœ‰ä»¥ä¸‹å‡ ¿Uæ–¹å¼ï¼š(x¨¬) 1. ¾l„äšgIDåQŒç»„件提供的¾l„äšg标识½W¦å·åQŒå¯ä»¥é€šè¿‡æ ‡è¯†½W¦æ¥è®‰K—®ã€‚å¦‚æžœç»„ä»¶æ²¡æœ‰æ ‡è¯†ç¬¦åøP¼Œæˆ‘们¿UîC¹‹ä¸ºåŒ¿åç»„ä»¶ã€?2. ¾l„äšgçš„interface¾c…R€‚如果一个组件的是通过interface向外服务的,那么我们可以通过interface来获取对应的¾l„äšg。如æž?interface的实çŽîCØ“(f¨´)多个¾l„äšgåQŒå°±ä¼?x¨¬)获得多个组件ã€? <br />   如果让我的组件被注册到这些容器中åQ?在IDEA中,有三¿Uç»„ä»Óž¼š(x¨¬) Application ComponentåQ?Project Componentå’ŒModule Component。不用的¾l„äšg需要ç‘ô承不同接口,分别为Application ComponentåQ?ProjectComponentå’ŒModuleComponentåQŒå¦‚果你的组件ç‘ô承了(ji¨£n)某一接口åQŒå°†ä¼?x¨¬)自动放¾|®åˆ°æŸä¸€å®¹å™¨ä¸­ï¼Œä¸éœ€è¦ä½ æ‰‹åЍåŽÀL³¨å†Œã€? <br />   ¾l„äšg既然要交¾l™å®¹å™¨åŽ»½Ž¡ç†åQŒè¿™ž®Þq‰µæ¶‰åˆ°ç”Ÿå‘½å‘¨æœŸçš„æ¦‚念,对于Application Component来说åQŒinitComponent负责初始化,disposeComponent负责资源清理。对ProjectComponent来说åQŒé™¤äº?ji¨£n)initComponentå’ŒdisposeComponentåQŒè¿˜å¢žåŠ äº?ji¨£n)projectOpened å’ŒprojectClosedåQŒè¿™ä¸ªæ„æ€è¿˜æ¯”较å®ÒŽ(gu¨©)˜“理解åQŒå°±æ˜¯ä¸€ä¸ªæŒ‚钩(hookåQ‰ã€‚组件一旦被‹È€‹z»ï¼Œž®±å¼€å§‹å‘挥它的作用啦ã€? <br />  ¾l„äšg的行为可能需要设¾|®ï¼Œå¦‚设¾|®ä¸åŒçš„参数¾l„äšg的特性就不一栗÷€‚如何给¾l„äšg讄¡½®å‚æ•°åQŸå½“然可以让¾l„äšg自èínåŽÕdšåQŒåŽ»æ‰¾ä¸€ä¸ªæ–‡ä»Óž¼Œå½“文件修改后重新加蝲。在IDEA中,你不需要这么做åQŒä½ åªéœ€è®©ç»„ä»¶ç‘ô承Configurable接口åQŒIDEAä¼?x¨¬)将在设¾|®é¢æ¿ä¸­æ·ÕdŠ ä¸€ä¸ªè®¾¾|®é€‰é¡¹åQŒè®©ä½ è®¾¾|®è¿™ä¸ªç»„件的参数åQŒå½“然包括运行期的,˜q™ä¸ªå¥½åƒå’ŒJMX相像ã€?:) <br />  ¾l„äšg的参数设¾|®å®Œæ¯•啦åQŒå½“容器关闭后,¾l„äšg带的˜q™äº›å‚数需要保存在一个地方,˜q™æ ·å½“容器重新启动后åQŒç»„件仍然能向以前一样工作,不然你又得重新设¾|®ä¸€ä¸‹ã€‚同æ ïL(f¨¥ng)š„道理åQŒä½ å¯ä»¥è‡ªå·±è®‘Ö®šé€»è¾‘åQŒä¿å­˜åˆ°æŸä¸€ä¸ªåœ°æ–¹ï¼Œç„¶åŽåœ¨åŠ è½½è“v来。如果IDEA提供äº?ji¨£n)一ä¸?JDOMExternalizable接口åQŒåªè¦å®žçŽ°æŽ¥å£åÆˆæ·ÕdŠ ž®‘量的代码,IDEAž®×ƒ¼š(x¨¬)完成component的参æ•îC¿å­˜å’Œè¯Õd–çš„ä“Q务。在最新的 IDEA 7.0中,采取äº?ji¨£n)另外一¿Uä¿å­˜æœºåˆÓž¼Œ˜q™ä¸ªæˆ‘们ä¼?x¨¬)在后面˜q›è¡Œè¯´æ˜Žã€? <br />   讲到˜q™é‡ŒåQŒä½ å¯èƒ½ä¼?x¨¬)é—®åQŒæœ‰æ²¡æœ‰ä¸€¿Uæ–¹é¢æ¥å£°æ˜ŽComponentåQ?˜q™æ˜¯æœ‰çš„åQŒé‚£ž®±æ˜¯extension point。extension point是组件的½Ž€åŒ–方式,它的主要功能是数据信息扩展,它们不需要ç‘ô承component接口åQŒåŒæ—¶ä¹Ÿæ²¡æœ‰¾l„äšg标识½W¦å·åQŒåªéœ€è¦åœ¨ plugin.xml声明ž®±å¯ä»¥ï¼Œåœ¨å£°æ˜Žçš„æ—¶å€™ä½ éœ€è¦æŒ‡åæ˜¯ä½•种¾cÕdž‹çš„组件。下面会(x¨¬)有更详细的介¾lã€? <br />  PicoContainer是IDEA基础åQŒå› ä¸ºæˆ‘们编写的¾l„äšg都是由容器初始化的,而且¾l„äšg直接的相互依赖也是有容器完成åQŒæ‰€æœ‰äº†(ji¨£n)解一下PicoContainer˜q˜æ˜¯å¾ˆæœ‰å¿…要的,å¯ÒŽ(gu¨©)’件编写和IDEA的机刉™ƒ½éžå¸¸æœ‰å¥½å¤„ã€?/p> </li> <li> <h4>Extension Points</h4> <h4> <hr /> </h4> <p>   前面讲解äº?ji¨£n)一下extions pointåQŒè¿™é‡Œæƒ³å†ç»†åŒ–一下。Extension point的主要作用是数据信息扩展和事件监听,也就是一个插件注册了(ji¨£n)某一extension pointåQŒå…¶ä»–插件可以通过extension point䏸™¯¥æ’äšg提供数据信息或触发事仉™€»è¾‘åQŒä»Žè€Œè¾¾åˆ°åª„(ji¨£ng)响上一插äšg中的¾l„äšg的一些行为。最典型的就是gotoSymbolContributoråQŒæˆ‘们在各个插äšg中通过gotoSymbolContributor的声明,提供插äšg自己的symbol信息¾l™IDEAåQŒè¿™æ ·åœ¨æŒ‰ä¸‹ Ctrl+Shift+Alt+Næ—Óž¼Œæ’äšg提供的symbol信息ž®×ƒ¼š(x¨¬)被提½Cºå‡ºæ¥ï¼Œå½“然你可以利用这¿Uæœºåˆ¶å®žçŽ°å…¶ä»–åŠŸèƒ½ï¼Œç›‘å¬ä¹Ÿæ˜¯ä¸€¿Uå®žçŽ°ã€‚ä»Žç”¨æˆ·çš„è§’åº¦æ¥çœ‹ï¼Œž®±æ˜¯åœ¨æŸäº›æ–¹é¢ï¼ŒåŽŸå…ˆçš„æ’ä»¶åŠŸèƒ½å¢žåŠ å•¦ã€‚é‚£ä¹ˆå¦‚ä½•å£°æ˜Žä¸€ä¸ªextension point呢。这个很½Ž€å•,只要建立一个Java IntegeraceåQŒç„¶åŽåœ¨plugin.xml˜q›è¡Œä»€ä¹ˆå°±å¯ä»¥å•¦ï¼Œä»£ç å¦‚下åQ? <br />          <extensionPoint name="resourceBundleManager" interface="com.intellij.lang.properties.psi.ResourceBundleManager" area="IDEA_PROJECT"/>     <br />   前面说过åQŒextension point是组件的½Ž€åŒ–方式,˜q™é‡Œçš„area是指¾l„äšg的类型,如果不指定就是ApplicationComponentåQŒIDEA_PROJECT表示 ProjectComponentåQŒMODULE_PROJECT表示ModuleComponent。声明完成后åQŒæˆ‘们需要在插äšg中访é—?extension point去获取数据,代码如下åQ? <br />          Object[] extensions = Extensions.getExtensions("plugin_id.testExtPoint"); <br />   ˜q™é‡Œå­—符串中的plugin_id表示pluginçš„idåQˆåœ¨xmlæ–‡äšg中)(j¨ª)åQŒtestExtPointž®±æ˜¯extension pointçš„name。还有一¿Uå°±æ˜¯æä¾›ExtensionPointNameåQŒè¿™ä¸ªå¯ä»¥å‚考一下Open APIåQŒä¹Ÿéžå¸¸½Ž€å•。这里返回一个数¾l„ï¼Œå› äØ“(f¨´)可能多个其他插äšg使用该extension point䏸™¯¥æ’äšg提供数据。接下来ž®±æ˜¯åœ¨å…¶ä»–插件应用该extension point啦,三个步骤åQ? <br />     1 首先依赖该插ä»Óž¼š(x¨¬)  <depends>reliant_plugin_id</depends> <br />     2 创徏extension pointçš„interface的实玎ͼŒjava¾~–码卛_¯ <br />     3 extension point引用声明åQŒxmlns的值就是所依赖的pluginçš„id。代码如下:(x¨¬) <br />             <extensions xmlns="reliant_plugin_id">     <br />                    <testExtPoint implementation="com.foobar.test.impl.Extender"/> <br />            </extensions> <br />   通过˜q™ç§æ–¹å¼åQŒå¯ä»¥å®žçŽ°æ’ä»¶ç›´æŽ¥çš„æ•°æ®ä¾›ç»™åQŒæ½CºåŽŸæœ‰æ’ä»¶çš„åŠŸèƒ½åQŒä¸€ä¸ªå¥½çš„æ’ä»Óž¼Œå¦‚果能定义好一下扩展点åQŒæ–¹ä¾¿å…¶ä»–插件进行扩充,ž®†æ˜¯éžå¸¸æœ‰ç›Šçš„ã€? <br />   事实上IDEA核心(j¨©)?y¨­u)®±æä¾›äº?ji¨£n)非常多的extension pointåQŒè¿™é‡Œä½ å¯ä»¥æ‰©å±•IDEA的功能。关于这些扩展点的元信息åQŒè¯·å‚考:(x¨¬)$IDEA_HOME/lib/resources.jaræ–‡äšgçš?META-INF/plugin.xmlæ–‡äšgã€?/p> </li> <li> <h4>Plugin的结构介¾l?</h4> <h4> <hr /> </h4> <p>    我们应该˜q›å…¥æ­£é¢˜å•¦ã€‚Plugin的主要功能扩展IDE的功能,前面我们讲述äº?ji¨£n)IDEA整体¾l“构是基于容器的åQŒé‚£ä¹ˆè¦æ‰©å±•IDEA的功能,唯一的方法就是想容器中添加组ä»Óž¼Œæ–°æ·»åŠ çš„¾l„äšg包含自èín的一些功能,同时和其他组件进行交互(修改一些参数和ç‰ÒŽ(gu¨©)€§ç­‰åQ‰ï¼Œå½±å“å…¶ä»–¾l„äšg的行为,从而达到功能的扩展目的。那么一个插件中åQŒåº”该会(x¨¬)包含application component, project componentå’Œmodule component。由于还要和用户˜q›è¡Œäº¤æ¢åQŒæ’件还提供äº?ji¨£n)actionåQŒä¹Ÿž®±æ˜¯å’Œç”¨æˆ¯‚¿›è¡Œäº¤æ¢çš„æ“ä½œåQŒæ‰€ä»¥æ’件的主要内容ž®±æ˜¯componentå’?action。这里顺便还聊一句,component是由容器½Ž¡ç†çš„,那么action可不可以也由容器½Ž¡ç†å‘¢ï¼Ÿ˜q™æ ·åœ¨action中引ç”?componentž®†æ›´åŠ æ–¹ä¾Ñ€‚目前action˜q˜ä¸æ˜¯ç”±å®¹å™¨½Ž¡ç†çš„,˜q™ä¸ªä¸»è¦æ˜¯ç”±åŽ†å²åŽŸå› å†›_®šçš„,不少action的代码还不能转移到容器中½Ž¡ç†åQŒä¸˜q?IDEAæ­£åœ¨åšä¸€äº›å·¥ä½œï¼Œç›æ€¿¡ä»¥åŽaction也可以由容器˜q›è¡Œ½Ž¡ç†ã€? <br />   下面我们要开始插件编写啦。首先我们要讑֮šä¸€ä¸‹æ’件的基本信息。插仉™œ€è¦æœ‰ä¸€ä¸ªå”¯ä¸€æ ‡è¯†½W¦ï¼Œæœ‰ä¸€ä¸ªç‰ˆæœ¬å·åQˆä¾¿äºŽå‡¾U§ï¼‰(j¨ª)˜q˜æœ‰ž®±æ˜¯é€‚用的IDEA版本。这三项应该说是必需的,其他ž®±æ˜¯æ’äšg的额外信息,如描˜qŽÍ¼ŒchangeLogåQŒä½œè€…ç­‰½{‰ï¼Œåœ¨plugin.xmlè®‘Ö®šž®±å¯ä»¥å•¦ã€? <br />   完成讑֮šåŽï¼Œæˆ‘们ž®±éœ€è¦å‘插äšg中添加内容啦。创建Componentå’ŒAction非常½Ž€å•,只要通过new groupž®±å¯ä»¥åˆ›å»ºã€‚图例如下:(x¨¬)</p> <p> </p> <p>˜q™é‡Œæˆ‘们可能˜q˜è¦å•°å—¦ä¸€ä¸‹ï¼Œž®±æ˜¯å…³äºŽplugin的目录结构。插件开发包中有一个plugin structureçš„html文档åQŒå·²¾lè®²˜q°çš„非常清楚åQŒè¿™é‡Œåªæ˜¯é‡å¤ä¸€ä¸‹ã€‚一个plugin通常包含plugin.xmlåQŒç›¸å…³çš„class和引用的½W¬ä¸‰æ–¹jaræ–‡äšg。如何组¾l‡è¿™äº›æ–‡ä»Óž¼Œæˆ‘推荐以下的¾l“æž„åQšæ’ä»¶ç›®å½•ä¸‹çš„libæ–‡äšg夹保存第三方jaræ–‡äšgåQˆå¦‚果没有引用第三方jaråQŒå¯ä»¥æ²¡æœ‰è¯¥ç›®å½•åQ‰ï¼Œclasses目录包含插äšg的代码,META-INF包含 plugin.xmlæ–‡äšgåQŒç»“构如下:(x¨¬)</p> <p> <img src="http://docs.google.com/File?id=dc73pj2h_36chsjjqf5" /> </p> </li> <li> <h4>使用Maven½Ž¡ç†æ’äšg™å¹ç›® </h4> <h4> <hr /> </h4> <p>     Maven实际上已¾læˆä¸ºJava™å¹ç›®½Ž¡ç†çš„规范,当然˜q™é‡Œæˆ‘们也希望IDEA的插件开发也能通过Maven½Ž¡ç†èµäh¥ã€‚Mavenòq¶ä¸éš¾ï¼Œä½†æ˜¯é’ˆå¯¹ IDEA的插仉™¡¹ç›®ä¸»è¦æœ‰ä»¥ä¸‹é—®é¢˜åQŒå¯èƒ½å¯¼è‡´ç®¡ç†æœ‰ä¸€å®šçš„隑ֺ¦åQ?. IDEAòq¶ä¸æ˜¯éƒ½ä½¿ç”¨Javac˜q›è¡Œä»£ç ¾~–译。如果你使用äº?ji¨£n)IDEAçš„UI DesigneråQŒé‚£ä¹ˆä½ å¾—ä‹É用Javac2才能¾~–译˜q™äº›ä»£ç åQ?2. 开发插仉™œ€è¦çš„IDEAçš„jaræ–‡äšg在repo1.maven.org/maven2中没有,你可能需要自å·Þp®¾å®šrepository的位¾|®ï¼›3. IDEA的插仉™œ€è¦è£…配,˜q™ä¸ªå¯èƒ½æ˜¯ä¸€äº›web™å¹ç›®åQŒjar™å¹ç›®ä¸å…·æœ‰çš„。基于这些原因,我想¾l™ä¸€ä¸ªç›¸å¯ÒŽ(gu¨©) ‡å‡†çš„pom.xmlæ–‡äšg和插仉™¡¹ç›®çš„目录¾l“æž„åQŒç›®å½•结构如下图åQšÂ?<br /><br />˜q™ä¸ªç›®å½•和标准Maven™å¹ç›®æ˜¯ä¸€è‡´çš„åQŒä¸˜q‡æœ‰ä¸€ç‚¹å°±æ˜¯æˆ‘们将plugin.xmlæ–‡äšg攄¡½®åœ¨src/main/resources目录下,最好åŞ成这æ ïL(f¨¥ng)š„æ ‡å‡†åQŒè¿™å¯¹åŽ¾l­çš„plugin打包分发有帮助ã€? <br />    回到pom.xmlæ–‡äšgåQŒå…¶å®žåªéœ€æ³¨æ„ä¸€ä¸‹ï¼ŒIDEA插äšg开发需要的jar包都åœ?<a >http://mevenide.codehaus.org/m2-repository/</a>, 所以我们需要设¾|®ä¸€ä¸‹é¡¹ç›®çš„repository的位¾|®ã€‚由于还使用äº?ji¨£n)codehaus的一些Maven插äšgåQŒæ‰€ä»¥è¿˜æœ‰è®¾¾|®ä¸€ä¸‹plugin repositoryçš„äØ“(f¨´)位置。下面就是设¾|®build pluginåQŒèƒ½ä¿è¯æ’äšg™å¹ç›®ä¸­çš„代码能被正确¾~–译åQŒä¸»è¦å°±æ˜¯IDEAçš„UI Designer的文件编译,其他的和标准的Maven¾~–译选项一致。接下来ž®±æ˜¯è®„¡½®dependencyåQŒç”±äºŽæ’件开发需要的jar包不ž®‘都包括åœ?IDEA SDK(前面我们讲述˜q?åQŒæ‰€æœ‰è¿™äº›dependencyçš„scope讄¡½®ä¸ºprovided卛_¯ã€‚如果你引用的是IntelliJ IDEA本èínçš„jar包,那可能还有注意一点:(x¨¬)ç”׃ºŽIDEAçš„jar包包括正式版本号和编译版本号åQŒæ‰€ä»¥ä½ å¯èƒ½˜q˜æœ‰¾l™dependency讄¡½® classifieråQŒè¿™ä¸ªå€¼å°±æ˜¯IDEA的编译版本号åQŒä¸€ä¸ªå…¸åž‹çš„dependency声明如下åQ? <br />       <dependency> <br />            <groupId>com.intellij.idea</groupId> <br />            <artifactId>openapi</artifactId> <br />            <version>7.0</version> <br />            <scope>provided</scope> <br />            <classifier>${idea_build_number}</classifier> <br />        </dependency> <br />    因䨓(f¨´)牉|¶‰åˆ°æ’件要发布出去åQŒæ‰€ä»¥æˆ‘们还是需要设¾|®ä¸€ä¸‹å¦‚何将插äšg打包。在Maven中这¿UîC¹‹ä¸ºAssemblyåQŒæ˜¯é€šè¿‡Assembly plugin完成。我们只需要创建Assembly的描˜q°æ–‡ä»Óž¼Œç„¶åŽåœ¨è®¾¾|®ä¸€ä¸‹Assembly插äšg的配¾|®ï¼Œæœ€åŽå’¨è¯¢mvn assembly:assemblyž®±å¯ä»¥å•¦ã€‚一个IDEA插äšg™å¹ç›®å…¸åž‹çš„Assembly的描˜q°æ–‡ä»¶å¦‚下所½Cºï¼š(x¨¬) <br />    <?xml version="1.0" encoding="utf-8" ?> <br />    <assembly  xmlns="<a xmlns:xsi="<a <br />         xsi:schemaLocation="<a >http://maven.apache.org/xsd/assembly</a><a >        <br />        <id/> <br />        <formats> <br />           <format>zip</format> <br />        </formats> <br />        <includeBaseDirectory>false</includeBaseDirectory> <br />        <dependencySets> <br />            <dependencySet> <br />            <outputDirectory>/gmail-plugin/lib</outputDirectory> <br />            <unpack>false</unpack> <br />            <scope>runtime</scope> <br />            <includes> <br />                <include>org.intellij:gmail-plugin</include> <br />                <include>net.sf:jgmail</include> <br />                <include>commons-httpclient:commons-httpclient</include> <br />                <include>commons-logging:commons-logging</include> <br />            </includes> <br />        </dependencySet> <br />     </dependencySets> <br />  </assembly>         <br />     在Assembly中出现的artifactåQŒå¦‚commons-httpclient需要能在pom.xml中解析得刎ͼˆåªè¦commons- httpclient处于dependency中就可以åQ‰ï¼Œ˜q™æ ·æˆ‘们ž®±å¯ä»¥å°†IDEA的插件打包成zipæ–‡äšgåQŒè¿™æ ·å°±å¯ä»¥å‘布åQŒçŽ°åœ¨ä½ åªè¦ž®†ç™»å½•到 <a >http://plugins.intellij.net</a>åQŒç„¶åŽä¸Šä¼ è¿™ä¸ªzipæ–‡äšgåQŒä½ çš„发布就完成啦。  Â?</p> </li> <li> <h4>IntelliJ IDEA TestCase </h4> <h4> <hr /> </h4> <p>    个äh对TDD˜q˜æ˜¯æ¯”较推崇的,所以在没有˜q›è¡Œå¼€å‘前åQŒè¿˜æ˜¯å…ˆä»‹ç»ä¸€ä¸‹å¦‚何进行测试。在com.intellij.testFramework包下包含各种 TestCaseåQŒä½ å¯ä»¥˜q›è¡Œç›¸å…³çš„单元测试。下面我们先看一下IDEA是如何运行TestCase的。IntelliJ IDEA在运行IDEAçš„TestCaseæ—Óž¼Œä¼?x¨¬)加载当前编辑的插äšgåQŒè¿™æ ·å°±ä¼?x¨¬)模拟出一个IDEA˜qè¡Œçš„真实环境,˜q™æ ·ä½ å°±å¯ä»¥˜q›è¡Œå„种‹¹‹è¯•。在实际的开发中åQŒæˆ‘ä»¬ç»å¸æ€¼š(x¨¬)PsiFileåQŒVirtualFile½{‰Java¾c»ï¼Œåœ¨plugin的内容组¾l‡æ–¹é¢ï¼Œä¹Ÿä¸»è¦æ˜¯ActionåQŒInspection ½{‰ï¼ŒIDEAçš„test framework都提供了(ji¨£n)˜q™äº›TestCaseåQŒå¾ˆæ–¹ä¾¿åœ°æµ‹è¯•这些类和组件。IdeaTestCase、LightIdeaTestCaseã€?PsiTestCase以及(qi¨¢ng)InspectionTestCase½{‰éƒ½æä¾›å¾ˆä¾¿æïL(f¨¥ng)š„æ–¹å¼æ¥æµ‹è¯•ä½ ¾~–写的代码。当然IDEA˜q˜æ²¡æœ‰æä¾›éžå¸¸å…¨é¢çš„‹¹‹è¯•æ–ÒŽ(gu¨©)¡ˆæ¥æµ‹è¯•ä“Q何代码,˜q™ä¸ªå¯èƒ½å¯¹TestCase设计¾~–写要求ä¼?x¨¬)比较高åQŒåº”该绝大多数情况下åQŒä½ è¦è‡ªå·Þp§‰å¾—怎样åŽÈ¼–写Unit Test。对于新的插件开发äh员,个äh廸™®®˜q˜æ˜¯TestCase加DebugåˆåÆˆä½¿ç”¨åQŒæ¯•竟这斚w¢çš„知识我们还是比较欠¾~ºç‚¹ã€‚参考一下别人编写的 TestCase可能ä¼?x¨¬)提升我们编写TestCase的水òqŸë€‚如何ä‹É用IDEA test framework提供的TestCaseåQŒè¿™ä¸ªå¾ˆ½Ž€å•,只要¾l§æ‰¿å“åº”çš„TestCaseåQŒç„¶åŽç¼–写代码就可以啦,没有ä»ÖM½•ç‰ÒŽ(gu¨©)®Šçš„要求。不要害怕,¾~–写几个TestCaseåQŒä½ ž®±æœ‰æ„Ÿè§‰å•¦ã€‚最后说一句,IDETalk插äšgçš„Unit Test写的不错åQŒå¤§å®¶å¯ä»¥å‚考一下,而且IDETalk的作者Kirill Maximov也写äº?ji¨£n)不是关于IDEA下Unit Test的文章ã€?/p> </li> <li> <h4>开发场æ™?</h4> <h4> <hr /> </h4> <p>   1 开发一个读写文件的ActionåQ? <br />          IDEA的设计思èµ\是多¾U¿ç¨‹è¯Õd•¾U¿ç¨‹å†™çš„æ¨¡å¼åQŒè€Œä¸”在AnAction中是不能˜q›è¡Œå†™æ“ä½œçš„åQŒå¦‚果你要在Action中进行写操作åQŒä½ éœ€è¦åˆ›å»ÞZ¸€ä¸?Runnable对象åQŒç„¶åŽäº¤¾l?ApplicationManager.getApplication().runWriteAction(runnable)åŽÀL‰§è¡Œã€? <br />   2 Editor ActionåQ? <br />          editor action主要用于操作当前¾~–辑½H—口中的内容åQŒé€šå¸¸éœ€è¦ç»™editor action讄¡½®ä¸€ä¸ªEditorWriteActionHandler来完成对editor的操作。EditorModificationUtil提供äº?ji¨£n)不ž®‘方法,可以加快开发。如果向惌™Ž·å–光标处的PsiElement对象åQŒéœ€è¦è®¾¾|®PsiFileçš?getElementByOffset(offsetåQ‰æ¥èŽ·å–ã€‚å¦‚æžœä½ æƒŒ™¿›è¡Œç›¸å…³çš„æ’入操作åQŒä½ å¯èƒ½éœ€è¦åˆ›å»ºæŒ‡å®šçš„PsiElementåQŒè¿™ä¸ªæ—¶å€?PsiElementFactory可能ä¼?x¨¬)帮你不ž®‘å¿™åQŒä½ å¯ä»¥å‚考一下PsiElementFactory APIåQŒçœ‹æ˜¯å¦æœ‰ä½ éœ€è¦çš„东西ã€? <br />  3 Intention Action:  <br />          intention action½Ž€å•地说就是意图操作,IDEAä¼?x¨¬)根据光标所在的位置åQŒè¿›è¡Œç›¸å…Ïx£€æŸ¥ï¼Œç„¶åŽæç¤ºå¯ä»¥˜q›è¡Œç›¸å…³çš„æ“ä½œã€‚intention action需要ç‘ô承IntentionAction¾c»ï¼Œéœ€è¦æä¾›family name(ID标识)å’Œdescription(昄¡¤ºåç§°)。在IntentionAction¾cÖM¸­åQŒisAvailable判断当前Intention Action是否有效åQŒinvoke表示你选择该intention action后执行的动作。PsiElement element = file.findElementAt(editor.getCaretModel().getOffset()); ˜q™ä¸ªè¯­å¥ç”¨æ¥èŽ·å–å½“å‰å…‰æ ‡å¤„çš„PsiElement。intention action˜q˜éœ€è¦æ³¨æ„çš„一点,ž®±æ˜¯æˆ‘们要在源码根目录徏立一个intentionDescriptions的目录,然后在依据family name建立一个子目录åQŒæœ€åŽæ·»åŠ ä¸‰ä¸ªæ–‡ä»Óž¼š(x¨¬)description.html、before.xxx.templateså’?after.xxx.templateåQŒxxx可以为某一¿Uç±»åž‹æ–‡ä»¶çš„æ‰©å±•名。如下图所½Cºï¼š(x¨¬)</p> <p> <img src="http://docs.google.com/File?id=dc73pj2h_37f3nkwjdr" /> </p> <p>最后,我们需要将˜q™ä¸ªaction˜q›è¡Œæ³¨å†ŒåQŒaction通常要归属于某一¾cÕdˆ«ã€‚注册有两种方式åQšä»£ç å’Œå£°æ˜Žã€‚ä»£ç äØ“(f¨´)åQšIntentionManager.getInstance().registerIntentionAndMetaData(new FirstIntentionAction(), "category"); 声明方式需要在plugin.xml中指定,代码如下åQ? <br />       <intentionAction> <br />          <className>com.foobar.FirstIntentionAction</className> <br />          <category>category</category> <br />       </intentionAction> <br />  4  Inspection action创徏 <br />       inspection actionž®±æ˜¯ä»£ç å®¡æŸ¥actionåQŒå®ƒå¯ä»¥‹‚€(g¨¨)查发çŽîC»£ç æ½œåœ¨çš„错误。如果你留意一下右下角的侦探头像,他就是代码审查员åQŒè´Ÿè´£è°ƒç”¨å„¿U?inspection actionåQŒå®Œæˆå¯¹ä»£ç çš„审查。如果发现潜在的问题åQŒå°±ä¼?x¨¬)给你一个解å†Ïx–¹æ¡ˆï¼Œä½ å¯ä»¥é€‰æ‹©è¯¥æ–¹æ¡ˆè¿›è¡Œé—®é¢˜ä¿®å¤ã€‚在IDEA讄¡½®é¢æ¿ä¸­çš„“Errors”选项åQŒå…¶å®žå°±æ˜¯inspection action的集合,目前IDEA 7.0大概包含800+个inspection actionåQŒå®¡æŸ¥ä»£ç çš„各个斚w¢åQŒå¯¹ä»£ç è´¨é‡çš„æå‡æœ‰å¾ˆå¤§çš„帮助ã€? <br />       ­a€å½’正传,如果¾~–写一个这æ ïL(f¨¥ng)š„action。首先我们创å»ÞZ¸€ä¸ªæ–°çš„inspection actionåQŒå®ƒéœ€è¦å®žçްLocalInspectionTool¾c…R€‚Inspection action需要提供short nameåQˆID标识åQ‰ï¼Œdisplay nameåQˆæ˜¾½CºååQ‰å’Œgroup display nameåQˆæ‰€åœ¨çš„¾l„名åQ? ˜q™æ ·inspection action可以更好地显½Cºã€‚å’ŒIntention Actionä¸€æ øP¼Œæˆ‘们需要在源码目录下徏立一个inspectionDescription的目录,然后依据short name创徏一个html文档åQŒå°†è¯¥inspection的功能进行描˜q°ã€‚图例如下:(x¨¬) <br /><img src="http://docs.google.com/File?id=dc73pj2h_38djc5swhn" /></p> <p>    LocalInspectionTool默认是检查Javaæ–‡äšg的,如果你想让LocalInspectionTool审查其他文äšgåQŒä½ éœ€è¦é‡å†?LocalInspectionTool¾cȝš„buildVisitoræ–ÒŽ(gu¨©)³•åQŒæ¥å®¡æŸ¥ç‰¹å®šçš„类型的PsiElementåQŒä½ å¯ä»¥å‚考一ä¸?LocalInpsectionTool的源码。前面我们讲到inspection actionä¼?x¨¬)提供一个解决问题的æ–ÒŽ(gu¨©)¡ˆåQŒåœ¨IDEA中这叫QuickFix。当我们‹‚€(g¨¨)查到一个错误时åQŒæˆ‘们需要创å»ÞZ¸€ä¸ªé—®é¢˜æ˜qŽÍ¼Œå¦‚果有必要的话,需要创å»ÞZ¸€ä¸ªquick fix来完成问题修复。注册一个问题,通常提供˜q™å››ä¸ªå‚敎ͼš(x¨¬)可能存在错误的PsiElement、警告çñ”别、描˜q°å’Œquickfix。这个可以通过 InspectionManager˜q›è¡Œå®¡æŸ¥é—®é¢˜åˆ›å¾ã€? <br />   目前åQŒæˆ‘们的Inspection Action已经完成啦,如何注册inspection actionåQ?å’Œintention actionçš„æ³¨å†Œä¸€æ øP¼Œæœ‰ä¸¤¿Uæ–¹å¼ï¼š(x¨¬)代码和extension point。代码方式:(x¨¬)需要创å»ÞZ¸€ä¸ªapplication componentåQŒç„¶åŽç‘ô承InspectionToolProvideråQŒåªè¦å®žçްInspectionToolProviderçš?getInspectionClasses()æ–ÒŽ(gu¨©)³•卛_¯ã€?extension pointåQšåŒintention action不一æ ïL(f¨¥ng)š„æ˜¯ï¼Œæˆ‘们要创å»ÞZ¸€ä¸ªç±»åQŒç‘ô承InspectionToolProvideråQŒè¿™ä¸ªç±»ä¸å¿…要ç‘ôæ‰?ApplicationComponentåQŒç„¶åŽå®žçްInspectionToolProviderçš„getInspectionClasses()åQŒæœ€åŽåœ¨plugin.xmlæ–‡äšg中进行声明,如下åQ? <br />   <inspectionToolProvider implementation="com.intellij.psi.css.CssInspectionsLoader"/>  <br />从理è®ÞZ¸Šæ¥è¯´åQŒIDEA是将inspectionToolProvider最ä¸ÞZ¸€ä¸ªapplication component对待ã€? <br />5. Annotator创徏 <br />     annotator™å‘֐æ€ä¹‰æ ‡æ³¨åQŒå°±æ˜¯ç»™ç›¸å…³çš„PsiElement加上标识åQŒè¿™ä¸ªæ ‡è¯†æ¶‰å?qi¨¢ng)到高亮昄¡¤ºã€è£…订栏åQˆè£…订栏æ·ÕdŠ å›¾æ ‡æ ‡è¯†åQ‰ç­‰½{‰ï¼Œannotator主要用于标识一些信息。编写annotatoråQŒæˆ‘们需要创å»ÞZ¸€ä¸ªç±»åQŒç‘ô承AnnotatoråQŒç„¶åŽæ ¹æ®psiElement来判断是否要¾l™elementæ·ÕdŠ æ ‡è¯†åQŒä¸»è¦æ˜¯å’ŒAnnotation打交到。最后,我们需要在plugin.xml中进行annotatorç”Ïx˜ŽåQŒå¦‚下:(x¨¬) <br />         <annotator language="JAVA" annotatorClass="cn.org.intellij.webx.ScreenAnnotator"/> <br />6. 讄¡½®¾l„äšg属性和状态保å­? <br />     前面我们讲过如何保存¾l„äšg的状态,在这里我们讲˜qîC¸€ä¸‹IDEA 7.0中的实现æ–ÒŽ(gu¨©)³•åQŒå¯èƒ½æœ‰ç‚¹ä¸ä¸€æ —÷€‚想要设¾|®ä¸€ä¸ªç»„件的状态,你需要ç‘ô承ConfigurableåQŒè¿™æ ·åœ¨è®„¡½®é¢æ¿ä¸­å°±ä¼?x¨¬)出çŽîC¸€ä¸ªé€‰é¡¹åQŒä½ å¯ä»¥˜q›è¡Œç›¸å…³çš„æ“ä½œã€‚接下来我们需要将讄¡½®çš„状态保存è“v来,˜q™æ˜¯æˆ‘们需要创建另外一个类åQŒä¸“门用于保存设¾|®ï¼Œæˆ‘们可以¿UîC¹‹ä¸ºSettings¾c»ï¼Œ˜q™ä¸ªSettings ¾c»éœ€è¦PersistentStateComponent¾c»ï¼Œè´Ÿè´£ä¿¡æ¯çš„保存和è¯Õd–。信息的è¯Õd–是通过一个@Stateçš„annotation来设¾|®çš„。到˜q™é‡ŒåQŒæˆ‘们就可以理解啦,一个类用于接收参数讑֮šåQŒä¸€ä¸ªç±»ç”¨äºŽå‚数保存和读取,ç”׃ºŽè¯¥ç±»åŒ…含相关参数åQŒæ‰€ä»¥å®ƒ?y¨­u)®±æ˜¯ä¸€ä¸ªServiceåQŒé€šå¸¸ž®†å‚数进行封装,对外提供服务åQŒä»£ç å¾ˆ½Ž€å•。接下来ž®±æ˜¯åœ¨plugin.xml中进行声明,我们可以参考一下Ruby插äšg中的例子åQ? <br />    <projectConfigurable implementation="com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable"/> <br />    <projectService serviceInterface="org.jetbrains.plugins.ruby.settings.RProjectSettings" serviceImplementation="org.jetbrains.plugins.ruby.settings.RProjectSettings"/> <br />下面是@State的描˜qŽÍ¼š(x¨¬) <br />    @State( <br />    name = YourPluginConfiguration.COMPONENT_NAME, <br />    storages = <a href="mailto:%7B@Storage%28id">{@Storage(id</a> = "your_id", file = "$PROJECT_FILE$")} <br />    ) <br />   在这个例子中我们使用äº?PROJECT_FILE$宏,你可以根据组件的¾cÕdž‹ä¸åŒè®„¡½®ä¸åŒçš„宏åQŒå¦‚下:(x¨¬) <br />   - application-level components (ApplicationComponent): $APP_CONFIG$, $OPTIONS$; <br />   - project-level components (ProjectComponent): $PROJECT_FILE$, $WORKSPACE_FILE$, $PROJECT_CONFIG_DIR$; <br />   - module-level components (ModuleComponent): $MODULE_FILE$ <br />7. gotoClassContributor <br />    在IDEA中,我们通常ä¼?x¨¬)按下Ctrl+N或Ctrl+All+Shift+NåŽÕd¯»æ‰„¡±»æˆ–symbolåQŒå¦‚果你æƒÏx‰©å±•各个功能,如在struts中,查找某一个action的声明,˜q™ä¸ªæ—¶å€™æˆ‘们需要扩展这一功能。这个时候我们只需创徏一个类åQŒè®©å…¶ç‘ô承ChooseByNameContributoråQŒå®žçŽ?ChooseByNameContributor的方法就可以。接下来ž®±æ˜¯åœ¨plugin.xml中进行声明,可以参考Struts, Ruby的插ä»Óž¼š(x¨¬) <br />        <gotoSymbolContributor implementation="org.jetbrains.plugins.ruby.ruby.gotoByName.RubySymbolContributor"/> </p> </li> <li> <h4>Virtual File, Document å’ŒPsi File </h4> <h4> <hr /> </h4> <p>     在IDEA中,我想å¯ÒŽ(gu¨©)–‡æœ¬çš„æ“ä½œå¯èƒ½ž®±æ˜¯˜q™ä¸‰ä¸ªåœ¨å‘挥作用åQŒè¿™ä¸‰è€…都可以å¯ÒŽ(gu¨©)–‡ä»¶çš„内容˜q›è¡Œæ›´æ”¹ã€? <br />     Virtual File是IDEA的统一文äšg¾pȝ»ŸåQŒå°±å‘Javaçš„IOä¸€æ øP¼Œæˆ‘们可以¿UîC¹‹ä¸ºVFS(虚拟文äšg¾pȝ»Ÿ)。有äº?ji¨£n)Virtual FileåQŒæˆ‘们不在需要和传统的文件打交到åQŒå–而代之的是VFS。我们对VFS的各¿Uæ“ä½œï¼Œä¼?x¨¬)映ž®„到传统的文件系¾lŸä¸Šã€‚IDEA中的所有和文äšg相关的操作都是通过Virtual File˜q›è¡ŒåQŒè¿™äº›æ“ä½œå’Œä¼ ç»Ÿçš„æ–‡ä»¶æ“ä½œå·®ä¸å¤šåQŒä¸˜q‡æ›´åŠ ç®€å•ã€? <br />     Document其实ž®±æ˜¯Virtual File的内容的字符序列åQŒæ‰€ä»¥å¯¹Document的各¿Uæ“ä½œéƒ½æ˜¯åŸºäºŽæ™®é€šæ–‡æœ¬çš„。Documentçš„å¯æ“ä½œçš„æ–¹æ³•åÆˆä¸å¤šåQŒä¸»è¦æ˜¯Document是基于字½W¦åºåˆ—çš„åQŒæ“ä½œè“v来难度有点大。事实上我们对Documentçš„ä‹É用也比较?y¨­u)®‘,通常都是一些信息的½Ž€å•获取ã€? <br />     Psi File˜q™ä¸ªæ˜¯ç»“构化的文件内容呈玎ͼŒ˜q™æ ·æˆ‘们通过操作¾l“构化的对象åQŒä»Žè€Œè¾¾åˆ°æ“ä½œæ–‡ä»¶å†…容的目的。这些结构化的对象通常通过一¿Uç¼–½E‹è¯­­a€æ¥ä½“玎ͼŒåœ?IDEA中,ž®±æ˜¯Java对象åQŒè¿™æ ähˆ‘们操作就更加½Ž€å•。这里我不知道这个例子是否合适,JDom是用Java对象来体现xml文档åQŒè¿™é‡ŒPsiFile ž®±æ˜¯ç”¨Java语言来体现各¿Uæ–‡ä»¶å†…宏V€‚讲到这里可能大家还没有体验PsiFile的好处,我们举一个例子来说明。现在有一个Javaæ–‡äšgåQŒé‚£ä¹ˆæˆ‘们就可以构徏一个PsiJavaFile对象åQŒé€šè¿‡è¯¥å¯¹è±¡ï¼Œæˆ‘们可以äº?ji¨£n)解该javaæ–‡äšg的一些信息,如package 名称åQŒimport语句列表åQŒåŒ…含的class。假设我们获取了(ji¨£n)PsiJavaFile的一个PsiClass对象åQŒæˆ‘们就可以äº?ji¨£n)解该Java¾cȝš„各种信息åQŒå¦‚名称、注释和包含的函数等½{‰ã€‚在˜q™é‡Œæˆ‘们可以更改PsiClass的名¿U°ã€æ³¨é‡Šç­‰½{‰ï¼Œ˜q™äº›ä¿®æ”¹é©¬ä¸Šž®×ƒ¼š(x¨¬)反映到文件的内容中。试想一下,如果˜q™ä¸€åˆ‡é€šè¿‡æ–‡æœ¬åˆ†æžå®ŒæˆåQŒé‚£ž®†æ˜¯å¤šä¹ˆå¤æ‚的工作,有了(ji¨£n)Psi FileåQŒè¿™ä¸€åˆ‡å°±½Ž€å•啦åQŒæ“ä½œå¯¹è±¡æ¯”操作文äšg内容要可靠简单的多。关于PSIåQŒè¯·å‚考一些IntelliJ IDEA的插件开发文档,同时我们推荐Psi Viewer˜q™ä¸ªæ’äšgåQŒä½ å¯ä»¥å¯¹IDEA处理内容做更好地理解。如果你惛_†™å‡ºå¥½çš„æ’件的话,你需要对PSI有较æ·Þqš„理解åQŒè™½ç„¶æˆ‘写的很少åQŒä½†æ˜¯å®ƒçš„重要性却相当高ã€?/p> </li> <li> <h4>数据兌™”¾l“æž„ </h4> <h4> <hr /> </h4> <p>   其实˜q™èŠ‚ä¸çŸ¥é“å¦‚ä½•å†™åQŸç« èŠ‚çš„åç§°ä¹Ÿæ€ªæ€ªçš„ã€‚æˆ‘ä»¬éƒ½çŸ¥é“IDEA的代码提½Cºã€ä»£ç å¯¼èˆªå’Œä»£ç é‡æž„非常强大åQŒè¿™èƒŒåŽçš„æ˜¯ä»€ä¹ˆæ ·çš„æ•°æ®ç»“构来支撑˜q™äº›ç‰ÒŽ(gu¨©)€§ã€‚在 IDEA中,通过一¿UReference机制可以ž®†å¾ˆå¤šçš„事情兌™”èµäh¥ã€‚回åˆîC¸Šä¸€èŠ‚æ‰€è¯´çš„åQŒåœ¨IDEA中,我们å¯ÒŽ(gu¨©)–‡ä»¶çš„内容操作åQŒé€šå¸¸éƒ½æ˜¯é€šè¿‡ PsiFile完成的。PsiFile中最ž®çš„元素ž®±æ˜¯PsiElementåQŒç”±äºŽPSI的设计合理,所以可以将PsiElement˜q›è¡Œå…Œ™”åQŒè¿™æ ·å¯ä»¥å®žçŽ°å¾ˆå¤šçš„ç‰ÒŽ(gu¨©)€§ã€‚ä‹D一个例子来说吧ã€?<bean id="personManager" class="com.foobar.PersonManagerImpl"/>˜q™æ˜¯ä¸€ä¸ªç®€å•xml元素åQŒä½†æ˜¯åœ¨˜q™ä¸ªäº‘素中,我们知道class的属性å€?XmlAttributeValue, PsiElemnt的子¾c?是和Java Class¾c»è¿›è¡Œå…³è”的。如果我们将ž®†XmlAttributeValueå’ŒPsiClass(Java¾cȝš„Psi¾l“æž„¾cÕdž‹)å…Œ™”èµäh¥åQŒé‚£ä¹ˆæˆ‘们就可以实现代码提示åQŒå¯¼èˆªå’Œé‡æž„åQˆå½“¾cÕdæ›´æ”¹ä¼?x¨¬)æ›´æ–°xml的属性å€û|¼‰(j¨ª)åQŒè¿™ä¸ªå…³è”çš„˜q‡ç¨‹ž®±æ˜¯Reference的实现。我们通过特定的Referencež®†è¿™ä¸¤è€…关联进行实玎ͼŒç„¶åŽ˜q›è¡Œæ³¨å†Œå£°æ˜ŽåQŒé‚£ä¹ˆæˆ‘们这¿Uå…³è”就建立èµäh¥åQŒæˆ‘们就ä¼?x¨¬)体会(x¨¬)到其中的便捗÷€‚IDEA包含特定的烦(ch¨³)引结构,你可以想象一下,™å¹ç›®ä¸­æ–‡ä»¶çš„内容都存在着一定的兌™”关系åQŒæœ€åŽåŞ成一个很大的¾|‘来¾l´æŠ¤˜q™äº›å…Œ™”。在IDEA启动æ—Óž¼Œä¼?x¨¬)花不少的时间来建立索引åQŒæ¥å½¢æˆ˜q™äº›å…Œ™”关系åQŒç›¸ä¿¡å¤§å®¶åœ¨æ‰“å¼€™å¹ç›®éƒ½èƒ½ä½“验到这一炏V€‚如果徏立这些关联关¾p»ï¼Œæœ‰å¾ˆå¤šä¸­å®žçŽ°æ–¹å¼åQŒä¸»è¦æ˜¯PsiReferenceå’ŒReferenceProvidersRegistryã€?PsiReference™å‘֐æ€ä¹‰ž®±æ˜¯å»ºç«‹PsiElement直接的关联,ReferenceProvidersRegistry则完成这些关联的注册和管理。关于这些方面的内容写è“v来比较琐¼„Žï¼Œå¦‚果你实çŽîCº†(ji¨£n)某一兌™”åQŒä»£ç æ½Cºã€å¯¼èˆªã€é‡æž„等都能很好的工作,对你的工作效率提升有很大的帮助ã€? <br />   前面介绍äº?ji¨£n)基本原理,下面我们看一下如何实现常用的几种兌™”方式。我们前面讲˜qîCº†(ji¨£n)PsiReferenceåQŒä½†æ˜¯è¿™é‡Œè¿˜æœ‰ä¸€ä¸?PsiReferenceProvider要介¾lä¸€ä¸‹ï¼Œå…¶å®žž®±æ˜¯å¯¹PsiReferenceçš„ä¸€ä¸ªå°è£…ï¼Œå› äØ“(f¨´) ReferenceProvidersRegistry˜q›è¡Œæ³¨å†Œçš„æ—¶å€™ï¼ŒåªæŽ¥å—PsiReferenceProviderã€?PsiReferenceProvider很简单,只需要将指定的PsiReference实例˜q”回卛_¯ã€?ReferenceProvidersRegistry的对象实例可以通过 ReferenceProvidersRegistry registry = ReferenceProvidersRegistry.getInstance(project); 接下来注册的代码可以在project component初始化的时候完成。下面让我们˜q›è¡Œå‡ ä¸ªæ ·ä¾‹å§ï¼š(x¨¬) <br />   1. xml tag的属性值和某一PsiElement˜q›è¡Œå…Œ™”åQšè¿™¿Uæƒ…形很常见åQŒå¦‚xmlTag的属性值和java classå…Œ™”åQŒxmlTag的属性值和java class fieldå…Œ™”½{‰ç­‰ã€‚如果实现这个关联呢。首先我们要扑ֈ°æŒ‡å®šçš„属性å€û|¼Œé€šå¸¸æˆ‘们通过三个参数ž®±å¯ä»¥ç¡®å®šï¼š(x¨¬) xmlçš„namspaceåQ?tag名称和属性名åQŒæœ‰äº?ji¨£n)这三个å€û|¼Œæˆ‘们ž®±å¯ä»¥ç¡®å®šè¯¥å±žæ€§å€û|¼Œä¸‹é¢ž®±æ˜¯å’ŒæŸä¸€reference providerå…Œ™”。代码如下:(x¨¬) <br />      String[] attributeNames=...; <br />      String tagName=...; <br />      NamespaceFilter namespaceFilter=...; <br />      PsiReferenceProvider referenceProvider=...;  <br />     registry.registerXmlAttributeValueReferenceProvider(attributeNames, new ScopeFilter(new ParentElementFilter(new AndFilter(new ClassFilter(XmlTag.class), new AndFilter(new OrFilter(new TextFilter(tagName)), namespaceFilter)), 2)), referenceProvider); <br />     如果你说åQŒè¿™ä¸ªxml没有namespaceåQŒä½ å¯èƒ½éœ€è¦æ ¹æ®æ”¹xml的特征写一个filteråQŒå®Œæˆå®šä½çš„需要。你可以ž®†ä¸Š˜q°çš„namespaceFilter替换ä¸ÞZ½ éœ€è¦çš„filter卛_¯ã€? <br />   2. xml tag的文本值和某一PsiElementå…Œ™”åQ?ç”׃ºŽIDEAòq¶æ²¡æœ‰æä¾›ç±»ä¼?registerXmlAttributeValueReferenceProvider˜q™æ ·çš„函敎ͼŒ˜q™æ ·xml tag的文本值就没法通过直接api的方式进行。IDEA提供äº?ji¨£n)è¿™æ ïL(f¨¥ng)š„一个方式:(x¨¬) registry.registerReferenceProvider(filter, XmlTag.class, psiReferenceProvider); 你只需要设定filter卛_¯ã€‚另外你可以通过registry.registerXmlTagReferenceProvider()也可以进行注册ã€? <br />  3. 字符串和某一PsiElementå…Œ™”åQšè¿™¿Uæƒ…形也很多åQŒå¦‚context.getBean("")åQŒå’Œxml中的bean tagå…Œ™”åQŒè¿™é‡Œçš„字符串作为函数的参数åQŒæœ‰äº?ji¨£n)实际的意义åQŒå¯èƒ½å°±ä¼?x¨¬)和某一个PsiElementå…Œ™”。这个关联注册很½Ž€å•, registry.registerReferenceProvider(filter, PsiLiteralExpression.class, psiReferenceProvider);  PsiLiteralExpression.class是文本的代表。这里要注意的是åQŒä¸€å®šè¦è®„¡½®å¥½filteråQŒå¦åˆ™ä¼š(x¨¬)很其他的代码带来问题。关于字½W¦ä¸²å’ŒPsiElementå…Œ™”˜q˜è¦æ³¨æ„ä¸€ç‚¹å°±æ˜¯PsiReferenceçš„isSoft一定要讄¡½®ä¸ºfalseåQŒå› ä¸ºIDEA中字½W¦ä¸²çš„默认提½Cºæ˜¯ property keyåQŒè¿˜æœ‰æ˜¯classpath中的路径åQŒå¦‚æžœisSoft为falseåQŒé‚£ä¹ˆå…¶ä»–的提示ž®†ä¸ä¼?x¨¬)出现ã€? <br />   ä¸Šé¢çš„ä¸‰ä¸ªæ˜¯æ¯”è¾ƒå¸¸è§çš„ã€‚è¯´åˆ°è¿™é‡Œï¼Œå› äØ“(f¨´)是要建立兌™”åQŒå¿…定涉å?qi¨¢ng)到更加字符串查找指定的PsiElement。在IDEA中我们可以通过 PsiManageråQŒPsiShortNamesCacheå’ŒPsiSearchHelper能完成不ž®‘的工作。如果还有问题的话,请参è€?PsiElementå’ŒPsiRecursiveElementVisitor完成查找工作ã€?/p> </li> <li> <h4>åŸÞZºŽxml的框架插件开发指å?</h4> <h4> <hr /> </h4> <p>     ˜q™ä¸€ç« èŠ‚å¯ä»¥è¯´æœ‰å®žé™…çš„æ„ä¹‰ï¼Œæ¯•ç«Ÿxml在各¿Uæ¡†æž¶ä¸­çš„应用还是毕竟广的(ž®½ç®¡annotation已经替代部分xml的功能)(j¨ª)。IntelliJ IDEA提供一个文档主要介¾låœ¨IntelliJ IDEA下如何通过DOM方式˜q›è¡Œxml操作åQ?a >http://www.jetbrains.com/idea/documentation/dom-rp.html</a>åQ‰ï¼Œ˜q™ä¸ªç« èŠ‚å¯ä»¥è¯´ä½œä¸ÞZ¸­æ–‡è¯´æ˜Žå’Œè¡¥å……。我不想ž®Þq»†èŠ‚å’Œå¤§å®¶æ²Ÿé€šï¼Œä¸»è¦è¯´çš„æ˜¯ä¸€ä¸ªæ­¥éª¤ï¼š(x¨¬) <br />    1. 创徏各种Dom Elementå?qi¨¢ng)其直接关系åQŒè¿™ä¸ªåœ¨IDEA DOM的文档中有描˜q°ã€‚这里我们说一下,根节炚wœ€è¦ç‘ô承CommonDomModelRootElementåQŒæ™®é€šèŠ‚ç‚šwœ€è¦ç‘ôæ‰?CommonDomModelElementåQŒæœ€å¥½ç»™æ¯ä¸€ä¸ªDom Element创徏对应的实现类åQŒä¸»è¦æ˜¯ä¸ÞZº†(ji¨£n)扩展。对于实现类åQŒæ ¹èŠ‚ç‚¹éœ€è¦å®žçŽ°RootBaseImplåQŒæ™®é€šèŠ‚ç‚¹å®žçŽ°BaseImplã€? <br />    2. 首先我们创徏一个DOM File DescriptoråQŒè¿›è¡ŒDom File注册åQŒè®©IDEA能在某一¾cÕdž‹çš„xmlå’ŒDom直接˜q›è¡Œæ˜ å°„。DomFileDescription提供一个isMyFile()æ–ÒŽ(gu¨©)³•åQŒå¯ä»¥å¸®åŠ©æˆ‘ä»¬ç¡®å®šxmlæ–‡äšg是否是Dom要求的。接下来在plugin.xml中进行声明:(x¨¬) <dom.fileDescription implementation="org.intellij.ibatis.IbatisConfigurationFileDescription"/> <br />    3. 如果有必要的话,¾l™Dom Element创徏各种converteråQ? <br />    4. 创徏DomModelå’ŒDomModelFactoryåQšxmlæ–‡äšg是提供基¼‹€ä¿¡æ¯çš„基矻I¼Œå¦‚果我们惌™®¿é—®xmlæ–‡äšg中的信息åQŒå¯ä»¥é€šè¿‡¾lŸä¸€çš„æŽ¥å£åŽ»è®‰K—®åQŒè¿™ä¸ªå°±æ˜¯DomModelå’ŒDomModelFactory。DomModel负责和Dom Element之间交互åQŒå¯¹å¤–提供服务。而DomModelFactory则创建DomModelåQŒDomModelFacotory能够处理各种情况åQŒå‡†¼‹®æž„建DomModelåQ? <br />    5. ˜q™æ ·æˆ‘们ž®±å®ŒæˆXML的基本处理。在实际的开发我们可能要参考这些类: DomManager, DomElement, DomUtil, ˜q™äº›¾c»éƒ½åœ¨com.intellij.util.xml包下åQŒå¾è®®çœ‹ä¸€ä¸‹ã€? <br />    6. æ€Èš„来说åQŒDOM的操作要比之间操作XmlFileå’ŒXmlTag要简单很多,如果你的插äšg中牵涉到xml操作åQŒè€ƒè™‘一下IDEA DOM是非常有必要的ã€?/p> </li> <li> <h4>Custom Language Plugin </h4> <h4> <hr /> </h4> <p>  写这节的目的有两点:(x¨¬)1. 开发中可能需要各¿Uè¯­­a€åQ?2. IntelliJ IDEA中支持语­a€æ³¨å…¥åQŒä½ ¾~–写的这一功能可能被应用到各种地方åQŒæå‡æ•ˆçŽ‡ã€‚ç”±äºŽCustom Language Plugin牉|¶‰åˆ°å¾ˆå¤šçš„内容åQŒå¦‚果你对这斚w¢æ„Ÿå…´­‘£ï¼Œå¯ä»¥å…ˆå‚考一ä¸?<a >http://www.jetbrains.com/idea/plugins/developing_custom_language_plugins.html</a>åQŒäº†(ji¨£n)解一下基本原理和自定义语­a€æ’äšg的功能。这里还要说一下就是关于JFlexåQŒé€šå¸¸ä½ éœ€è¦äº†(ji¨£n)è§£è¿™ä¸ªå·¥å…øP¼Œå®ƒæ˜¯è¯æ³•分析器,和IDEA能结合的很好åQŒåŒæ—?IDEA也提供了(ji¨£n)JFlex PluginåQŒä½ å¯ä»¥˜q›è¡ŒJFlex相关的试验。关于这部分内容åQŒåœ¨åŽç®‹æˆ‘还ä¼?x¨¬)更斎ͼŒä¸»è¦æ˜¯æƒ³é€šè¿‡ä¸€ä¸ªå…·ä½“的例子来说明ã€?/p> </li> <li> <h4>代码提示相关</h4> <h4> <hr /> </h4> <p>   如果你想在编辑窗口实çŽîC»£ç æ½Cºï¼Œé€šå¸¸æœ‰ä¸‰¿Uæ–¹å¼ï¼š(x¨¬) PsiReferenceåQŒCompletionDataå’ŒLookupManageråQŒå…¶ä¸­PsiReferenceåQŒCompletionData是系¾lŸç›´æŽ¥è°ƒç”¨çš„åQŒè€ŒLookupManager需要你手动触发的。PsiReference前面已经介绍˜q‡ï¼Œž®±æ˜¯é€šè¿‡PsiElementä¹‹é—´ç›æ€º’å…Œ™”来进行的。CompletionData则是和某一¿Uè¯­­a€½Ž¡ç†èµäh¥åQŒåœ¨è°ƒç”¨ä»£ç æç¤ºæ—¶ä¼š(x¨¬)触发˜q™æ®µä»£ç åQŒä»Žè€Œè¾¾åˆ°æ½Cºçš„目的。LookupManagerž®±å®Œå…¨æ‰‹åŠ¨ç¼–ç æ–¹å¼ï¼Œž®±æ˜¯æ‰‹åŠ¨è§¦å‘ä¸€ä¸ªä»£ç æ½Cºæ¡†åQŒåªä¸è¿‡LookupManager帮你做了(ji¨£n)很多åQŒè€Œä¸ç”¨å…³å¿?j¨©)很多的¾l†èŠ‚ã€?/p> </li> <li> <h4>Inspection Actionå’ŒIntention Action¾~–写注意事项</h4> <h4> <hr /> </h4> <p>   在进行Inspection讲解之前åQŒè®©æˆ‘看一下Inpsection的结构:(x¨¬)</p> <p> <img src="http://docs.google.com/File?id=dc73pj2h_46dcsfbmn6" /> <br />在此¾l“构中,我们可以看到一个Inspection需要一个Visitor去访问某一起始点下的各个子PsiElementåQŒåœ¨éåŽ†å„ä¸ª PsiElement的过½E‹ä¸­åQŒå½“发现问题时注册问题描˜qŽÍ¼ˆProblemDescriptionåQ‰ï¼Œå¦‚果该问题有对应的QuickFixåQŒåˆ™ž®†è¯¥é—®é¢˜æè¿°å’ŒQuickFixå…Œ™”èµäh¥ã€‚Inspection的机制如下:(x¨¬) <br />   1. Inspection Manager调用某一Inspection来审查某一PsiElement <br />   2. Inpsectionä¼?x¨¬)调用visitor去访问该PsiElement的各个子PsiElement <br />   3. 在访问各个子PsiElementæ—Óž¼Œå¦‚果发现äº?ji¨£n)问题,˜q™åˆ›å»ºå¯¹åº”的问题描述åQŒå¦‚果该问题包含对应的QuickFixåQŒåˆ™˜q›è¡Œå…Œ™” <br />   4. 当用戯‚°ƒç”¨quickfixæ—Óž¼Œè§¦å‘quickfix的执è¡? <br />在实际的¾~–码中,我们看一下BaseInspection的结构:(x¨¬) <br /><img src="http://docs.google.com/File?id=dc73pj2h_47ghnw9tcz" /><br />通常一个Inspection只会(x¨¬)å…Ïx³¨ä¸€¿Ué—®é¢˜ï¼ŒåŸÞZºŽ˜q™ä¸ªåŽŸåˆ™åQŒæ‰€æœ‰é”™è¯¯æ½Cºåº”该是一æ ïL(f¨¥ng)š„åQŒæ‰€ä»¥BaseInspection需要你提供一个统一的问题描˜q°ã€‚对应同一个问题的解决æ–ÒŽ(gu¨©)³•åQŒå½“然可能有一¿Uæˆ–多种åQŒæ‰€ä»¥BaseInspection提供äº?ji¨£n)buildFixå’ŒBuildFixesåQŒä½ åªéœ€è¦å®žçŽîC¸€ä¸ªå³å¯ã€‚最后是Visitor的创建,BaseInspection引入äº?ji¨£n)BaseInspectionVisitoråQŒé¡¾åæ€ä¹‰ž®±æ˜¯ä¸“é—¨ä¸?inspection做的的visitoråQŒåŒ…含了(ji¨£n)针对Inspecitond的常用方法。Visitor同时包含ProlemsHolderå’?Inspection对象åQŒè¿™æ ·åœ¨å‘现问题的时候,马上可以ž®†é—®é¢˜å’Œè¯¥inspection对应的解å†Ïx–¹æ³•关联è“v来。这里还有一ä¸?InspectionGadgetsFixåQŒè¿™ä¸ªç±»æ²¡æœ‰å¤ªå¤šçš„解释,主要目的ž®±æ˜¯åŽÕdšä¸€äº›åˆ¤å®šï¼Œæ˜¯å¦å¯ä»¥˜q›è¡ŒQuickFix操作½{‰ã€‚通过˜q™ç§¾l“构调整åQŒæµ½E‹å’Œä»£ç ž®Þq®€å•了(ji¨£n)很多åQŒä½ åˆ›å¾Inspectionž®±å®¹æ˜“多啦ã€? <br />同样的原理可用在Intention Action上,在Intention Action中,首先通过一个predicate来进行匹配判断,如果匚w…åŽåˆä¸“门的处理逻辑˜q›è¡Œæ“ä½œåQŒå®Œæˆintention actionã€?/p> </li> <li> <h4>FAQ </h4> <h4> <hr /> </h4> <p> <b>Q:</b> 插äšg中的囄¡‰‡å¤§å°æœ‰å“ªäº›è¦æ±‚? <br /><b>A:</b> 在菜单栏中出现的囄¡‰‡è¦æ˜¯æ˜?6x16çš„png囄¡‰‡åQ›åœ¨è®„¡½®é¢æ¿ä¸­å‡ºçŽ°çš„å›„¡‰‡è¦æ±‚æ˜?8x48çš„png囄¡‰‡ã€‚这些图片通常都是要求透明的,如果你不知道怎么制作透明的png囄¡‰‡çš„话åQŒä½ å¯ä»¥é€šè¿‡ImageMagick提供的命令行行进行操ä½? >convert  -transparent white logo.png logo_1.png <br /><b>Q:</b> 如何创徏Live Template的自定义functionåQ? <br /><b>A:</b> 在Open API里没有涉å?qi¨¢ng)到˜q™ä¸ªæ–šw¢åQŒä½ éœ€è¦å‚考一下Macroå’ŒMacroFactoryåQŒMacro是自定义函数的接口,MacroFactory完成注册åQŒä½ å¯ä»¥å‚考一下CapitalizeMacro的实玎ͼŒåœ¨Web Service插äšg中也有例子ã€? <br /><b>Q:</b> 如何讉K—®å‰ªåˆ‡æ¿ï¼Ÿ <br /><b>AåQ?/b>你可以通过CopyPasteManager˜q›è¡Œè®‰K—®åQŒä¸‹é¢æ˜¯ä¸€ä¸ªæƒ³å‰ªåˆ‡æ¿æ·»åŠ å†…å®¹çš„ä¾‹å­ã€? <br />CopyPasteManager copyPasteManager = CopyPasteManager.getInstance (); <br />copyPasteManager.setContents (new StringSelection ("the character string which we would like to copy appointment"));</p> </li> <li> <h4>参考资æº?/h4> <h4> <hr /> </h4> <p>  ˜q™é‡Œæˆ‘不惛_ˆ—出几½‹‡æ–‡æ¡£ï¼Œ˜q™äº›æ–‡æ¡£åªèƒ½èµ·åˆ°æ‰«ç›²çš„作用,如果你想开发插ä»Óž¼Œä»Žæ‰«ç›²ç‰ˆæ¯•ä¸šæ˜¯è¿œä¸å¤Ÿçš„ã€‚ä¸ªäººçš„å»ø™®®åQŒå¤šçœ‹åˆ«äººçš„æ’äšgåQŒå¤šçœ‹è®ºå›çš„帖子åQŒå¤šçœ‹APIåQŒå¤šå®žè·µã€? <br />  IntelliJ IDEA官方论坛åQ?<a >http://www.intellij.net/forums</a><br />  Jira for Open APIåQ?a >http://www.jetbrains.net/jira/secure/IssueNavigator.jspa?reset=true&mode=hide&pid=10132&component=10366</a><br />  插äšg的源码库åQ?<a >http://svn.jetbrains.org/idea/Trunk</a><br />  现在不少™å¹ç›®éƒ½åœ¨Google Code上安家啦åQŒä½ å¯ä»¥åŽ»Google Code上搜索关于IDEA的插ä»Óž¼Œç„¶åŽäº?ji¨£n)解他äh的想法和代码åQŒå¯¹è‡ªå·±çš„帮助会(x¨¬)很大ã€?/p> </li> <img src ="http://www.aygfsteel.com/ideame/aggbug/234974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ideame/" target="_blank">ideame</a> 2008-10-17 17:00 <a href="http://www.aygfsteel.com/ideame/archive/2008/10/17/234974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何˜q›åˆ¶è½¬æ¢http://www.aygfsteel.com/ideame/archive/2007/04/20/112141.htmlideameideameFri, 20 Apr 2007 02:36:00 GMThttp://www.aygfsteel.com/ideame/archive/2007/04/20/112141.htmlhttp://www.aygfsteel.com/ideame/comments/112141.htmlhttp://www.aygfsteel.com/ideame/archive/2007/04/20/112141.html#Feedback0http://www.aygfsteel.com/ideame/comments/commentRss/112141.htmlhttp://www.aygfsteel.com/ideame/services/trackbacks/112141.html
int a = 32;
System.out.println(
"二进åˆÓž¼š(x¨¬) "+Integer.toBinaryString(a));
System.out.println(
"十六˜q›åˆ¶åQšÂ?/span>"+Integer.toHexString(a));
System.out.println(
"å…«è¿›åˆÓž¼š(x¨¬) "+Integer.toOctalString(a));
System.out.println(
"十二˜q›åˆ¶åQšÂ?/span>"+Integer.toString(month, 12));

String s
="66";
System.out.println(Integer.toString(Integer.parseInt(s,
12), 6));



ideame 2007-04-20 10:36 发表评论
]]>
复合帔R‡çš„é—®é¢?/title><link>http://www.aygfsteel.com/ideame/archive/2007/04/20/112137.html</link><dc:creator>ideame</dc:creator><author>ideame</author><pubDate>Fri, 20 Apr 2007 02:26:00 GMT</pubDate><guid>http://www.aygfsteel.com/ideame/archive/2007/04/20/112137.html</guid><wfw:comment>http://www.aygfsteel.com/ideame/comments/112137.html</wfw:comment><comments>http://www.aygfsteel.com/ideame/archive/2007/04/20/112137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ideame/comments/commentRss/112137.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ideame/services/trackbacks/112137.html</trackback:ping><description><![CDATA[可以使用一个变量或字段记录几个复合状态:(x¨¬)<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: rgb(0, 0, 0);"><br /><br /></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> a </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br /> System.out.println(a);<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toBinaryString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"><br /> Integer.toBinaryString(a));<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toHexString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> I(y¨ªng)nteger.toHexString(a));<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toOctalString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"><br /> Integer.toOctalString(a));<br /> a </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;<br /> System.out.println(a);<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toBinaryString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"><br /> Integer.toBinaryString(a));<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toHexString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> I(y¨ªng)nteger.toHexString(a));<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toOctalString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"><br /> Integer.toOctalString(a));<br /><br /> a </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;<br /> System.out.println(a);<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toBinaryString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"><br /> Integer.toBinaryString(a));<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toHexString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> I(y¨ªng)nteger.toHexString(a));<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toOctalString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"><br /> Integer.toOctalString(a));<br /><br /> a </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">8</span><span style="color: rgb(0, 0, 0);">;<br /> System.out.println(a);<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toBinaryString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"><br /> Integer.toBinaryString(a));<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toHexString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> I(y¨ªng)nteger.toHexString(a));<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Integer.toOctalString(a)=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"><br /> Integer.toOctalString(a));<br /><br /></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> b </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">8</span><span style="color: rgb(0, 0, 0);">;<br /> System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">1 | 2 | 4 | 8 = </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> b);<br /><br /></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> b1 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;<br /> System.out.println(b1 </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> is I(y¨ªng)n </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> b </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ? </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> ((b1 </span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(0, 0, 0);"> b) </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> b1) );<br /><br /></span></div><br /><br /><img src ="http://www.aygfsteel.com/ideame/aggbug/112137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ideame/" target="_blank">ideame</a> 2007-04-20 10:26 <a href="http://www.aygfsteel.com/ideame/archive/2007/04/20/112137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于JavaBeanå’ŒXMLçš„è{æ?/title><link>http://www.aygfsteel.com/ideame/archive/2007/03/23/105953.html</link><dc:creator>ideame</dc:creator><author>ideame</author><pubDate>Fri, 23 Mar 2007 11:02:00 GMT</pubDate><guid>http://www.aygfsteel.com/ideame/archive/2007/03/23/105953.html</guid><wfw:comment>http://www.aygfsteel.com/ideame/comments/105953.html</wfw:comment><comments>http://www.aygfsteel.com/ideame/archive/2007/03/23/105953.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ideame/comments/commentRss/105953.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ideame/services/trackbacks/105953.html</trackback:ping><description><![CDATA[ <p>今天试了(ji¨£n)个XMLå’ŒJavaBean转换的èÊYä»¶JOXåQŒä¹‹å‰ä¸€ç›´æœ‰˜q™æ ·çš„需求,但比较来比较去还是这个比较简单实用。我想除非我有WS的需求,否则象JIBXå’ŒAPACHE çš„WS工具å¯ÒŽ(gu¨©)ˆ‘来说都是重量¾U§çš„ã€?/p> <p>先看看输出结果:(x¨¬)</p> <!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 0);"> <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"> <!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> <span style="color: rgb(0, 0, 0);">            <br />  </span> <span style="color: rgb(0, 0, 255);"><?</span> <span style="color: rgb(255, 0, 255);">xml version="1.0" encoding="ISO-8859-1"</span> <span style="color: rgb(0, 0, 255);">?></span> <span style="color: rgb(0, 0, 0);"> <br />  </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">ApproxItem </span> <span style="color: rgb(255, 0, 0);">java-class</span> <span style="color: rgb(0, 0, 255);">="com.greatwall.csi.np.model.ApproxItem"</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />      </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">expose </span> <span style="color: rgb(255, 0, 0);">java-class</span> <span style="color: rgb(0, 0, 255);">="java.lang.Double"</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);">0.23</span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">expose</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />      </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">list </span> <span style="color: rgb(255, 0, 0);">java-class</span> <span style="color: rgb(0, 0, 255);">="com.greatwall.csi.np.model.ApproxInfo"</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />          </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">IDno</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);">bbb</span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">IDno</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />          </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">birth </span> <span style="color: rgb(255, 0, 0);">java-class</span> <span style="color: rgb(0, 0, 255);">="java.lang.Integer"</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);">222</span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">birth</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />      </span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">list</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />      </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">map </span> <span style="color: rgb(255, 0, 0);">java-class</span> <span style="color: rgb(0, 0, 255);">="java.util.HashMap"</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />          </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">dd </span> <span style="color: rgb(255, 0, 0);">java-class</span> <span style="color: rgb(0, 0, 255);">="com.greatwall.csi.np.model.ApproxInfo"</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />              </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">IDno</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);">bbb</span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">IDno</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />              </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">birth </span> <span style="color: rgb(255, 0, 0);">java-class</span> <span style="color: rgb(0, 0, 255);">="java.lang.Integer"</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);">222</span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">birth</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />          </span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">dd</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />          </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">ss </span> <span style="color: rgb(255, 0, 0);">java-class</span> <span style="color: rgb(0, 0, 255);">="com.greatwall.csi.np.model.ApproxInfo"</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />              </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">IDno</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);">bbb</span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">IDno</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />              </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">birth </span> <span style="color: rgb(255, 0, 0);">java-class</span> <span style="color: rgb(0, 0, 255);">="java.lang.Integer"</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);">222</span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">birth</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />          </span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">ss</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />      </span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">map</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />      </span> <span style="color: rgb(0, 0, 255);"><</span> <span style="color: rgb(128, 0, 0);">month </span> <span style="color: rgb(255, 0, 0);">java-class</span> <span style="color: rgb(0, 0, 255);">="java.lang.Integer"</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);">3923</span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">month</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> <br />  </span> <span style="color: rgb(0, 0, 255);"></</span> <span style="color: rgb(128, 0, 0);">ApproxItem</span> <span style="color: rgb(0, 0, 255);">></span> <span style="color: rgb(0, 0, 0);"> </span> </div> <br /> </span> <p>在看看原来的JavaBeanåQ?/p> <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"> <!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <span style="color: rgb(0, 0, 0);">  </span> <span style="color: rgb(0, 0, 255);">package</span> <span style="color: rgb(0, 0, 0);"> com.greatwall.csi.np.model;<br /><br />   </span> <span style="color: rgb(0, 0, 255);">import</span> <span style="color: rgb(0, 0, 0);"> java.util.ArrayList;<br />   </span> <span style="color: rgb(0, 0, 255);">import</span> <span style="color: rgb(0, 0, 0);"> java.util.HashMap;<br /><br />   </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">class</span> <span style="color: rgb(0, 0, 0);"> ApproxItem {<br />       </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">int</span> <span style="color: rgb(0, 0, 0);"> getMonth() {<br />           </span> <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 0);"> month;<br />       }<br /><br />       </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">void</span> <span style="color: rgb(0, 0, 0);"> setMonth(</span> <span style="color: rgb(0, 0, 255);">int</span> <span style="color: rgb(0, 0, 0);"> month) {<br />           </span> <span style="color: rgb(0, 0, 255);">this</span> <span style="color: rgb(0, 0, 0);">.month </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> month;<br />       }<br /><br />       </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">double</span> <span style="color: rgb(0, 0, 0);"> getExpose() {<br />           </span> <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 0);"> expose;<br />       }<br /><br />       </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">void</span> <span style="color: rgb(0, 0, 0);"> setExpose(</span> <span style="color: rgb(0, 0, 255);">double</span> <span style="color: rgb(0, 0, 0);"> expose) {<br />           </span> <span style="color: rgb(0, 0, 255);">this</span> <span style="color: rgb(0, 0, 0);">.expose </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> expose;<br />       }<br /><br />       </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> ArrayList getList() {<br />           </span> <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 0);"> list;<br />       }<br /><br />       </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> HashMap getMap() {<br /><br />           </span> <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 0);"> map;<br />       }<br /><br />       </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">void</span> <span style="color: rgb(0, 0, 0);"> setList(ArrayList list) {<br />           </span> <span style="color: rgb(0, 0, 255);">this</span> <span style="color: rgb(0, 0, 0);">.list </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> list;<br />       }<br /><br />       </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">void</span> <span style="color: rgb(0, 0, 0);"> setMap(HashMap map) {<br />           </span> <span style="color: rgb(0, 0, 255);">this</span> <span style="color: rgb(0, 0, 0);">.map </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> map;<br />       }<br /><br />       </span> <span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">int</span> <span style="color: rgb(0, 0, 0);"> month;<br />       </span> <span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">double</span> <span style="color: rgb(0, 0, 0);"> expose;<br />       </span> <span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 0);"> ArrayList list;<br />       </span> <span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 0);"> HashMap map;<br />   }</span> </div> <p> <code> </code> </p> <p>处理¾l“果是ä×o(h¨´)人满意的。实现过½E‹å¦‚下:(x¨¬)</p> <br /> <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"> <!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">class</span> <span style="color: rgb(0, 0, 0);"> JOXUtils {<br /><br />     </span> <span style="color: rgb(0, 128, 0);">/**</span> <span style="color: rgb(0, 128, 0);"> <br />      * Retrieves a bean object for the<br />      * received XML and matching bean class<br />      </span> <span style="color: rgb(0, 128, 0);">*/</span> <span style="color: rgb(0, 0, 0);"> <br />     </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">static</span> <span style="color: rgb(0, 0, 0);"> Object fromXML(String xml, Class className) {<br />         ByteArrayInputStream xmlData </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">new</span> <span style="color: rgb(0, 0, 0);"> ByteArrayInputStream(xml.getBytes());<br />         JOXBeanInputStream joxIn </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">new</span> <span style="color: rgb(0, 0, 0);"> JOXBeanInputStream(xmlData);<br />         </span> <span style="color: rgb(0, 0, 255);">try</span> <span style="color: rgb(0, 0, 0);"> {<br />             </span> <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 0);"> (Object) joxIn.readObject(className);<br />         } </span> <span style="color: rgb(0, 0, 255);">catch</span> <span style="color: rgb(0, 0, 0);"> (IOException exc) {<br />             exc.printStackTrace();<br />             </span> <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">null</span> <span style="color: rgb(0, 0, 0);">;<br />         }<br />         </span> <span style="color: rgb(0, 0, 255);">finally</span> <span style="color: rgb(0, 0, 0);"> {<br />             </span> <span style="color: rgb(0, 0, 255);">try</span> <span style="color: rgb(0, 0, 0);"> {<br />                 xmlData.close();<br />                 joxIn.close();<br />             } </span> <span style="color: rgb(0, 0, 255);">catch</span> <span style="color: rgb(0, 0, 0);"> (Exception e) {<br />                 e.printStackTrace();<br />             }<br />         }<br />     }<br /><br />     </span> <span style="color: rgb(0, 128, 0);">/**</span> <span style="color: rgb(0, 128, 0);"> <br />      * Returns an XML document String for the received bean<br />      </span> <span style="color: rgb(0, 128, 0);">*/</span> <span style="color: rgb(0, 0, 0);"> <br />     </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">static</span> <span style="color: rgb(0, 0, 0);"> String toXML(Object bean) {<br />         ByteArrayOutputStream xmlData </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">new</span> <span style="color: rgb(0, 0, 0);"> ByteArrayOutputStream();<br />         JOXBeanOutputStream joxOut </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">new</span> <span style="color: rgb(0, 0, 0);"> JOXBeanOutputStream(xmlData);<br />         </span> <span style="color: rgb(0, 0, 255);">try</span> <span style="color: rgb(0, 0, 0);"> {<br />             joxOut.writeObject(beanName(bean), bean);<br />             </span> <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 0);"> xmlData.toString();<br />         } </span> <span style="color: rgb(0, 0, 255);">catch</span> <span style="color: rgb(0, 0, 0);"> (IOException exc) {<br />             exc.printStackTrace();<br />             </span> <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">null</span> <span style="color: rgb(0, 0, 0);">;<br />         }<br />         </span> <span style="color: rgb(0, 0, 255);">finally</span> <span style="color: rgb(0, 0, 0);"> {<br />             </span> <span style="color: rgb(0, 0, 255);">try</span> <span style="color: rgb(0, 0, 0);"> {<br />                 xmlData.close();<br />                 joxOut.close();<br />             } </span> <span style="color: rgb(0, 0, 255);">catch</span> <span style="color: rgb(0, 0, 0);"> (Exception e) {<br />                 e.printStackTrace();<br />             }<br />         }<br />     }<br /><br />     </span> <span style="color: rgb(0, 128, 0);">/**</span> <span style="color: rgb(0, 128, 0);"> <br />      * Find out the bean class name<br />      </span> <span style="color: rgb(0, 128, 0);">*/</span> <span style="color: rgb(0, 0, 0);"> <br />     </span> <span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">static</span> <span style="color: rgb(0, 0, 0);"> String beanName(Object bean) {<br />         String fullClassName </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> bean.getClass().getName();<br />         String classNameTemp </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> fullClassName.substring(<br />             fullClassName.lastIndexOf(</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">.</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">) </span> <span style="color: rgb(0, 0, 0);">+</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 0);">1</span> <span style="color: rgb(0, 0, 0);">,<br />             fullClassName.length()<br />             );<br />         </span> <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 0);"> classNameTemp.substring(</span> <span style="color: rgb(0, 0, 0);">0</span> <span style="color: rgb(0, 0, 0);">, </span> <span style="color: rgb(0, 0, 0);">1</span> <span style="color: rgb(0, 0, 0);">)<br />             </span> <span style="color: rgb(0, 0, 0);">+</span> <span style="color: rgb(0, 0, 0);"> classNameTemp.substring(</span> <span style="color: rgb(0, 0, 0);">1</span> <span style="color: rgb(0, 0, 0);">);<br />     }<br />     <br />     </span> <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">static</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">void</span> <span style="color: rgb(0, 0, 0);"> main(String[] args) {<br />         ApproxItem approxItem </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">new</span> <span style="color: rgb(0, 0, 0);"> ApproxItem();<br />         approxItem.setMonth(</span> <span style="color: rgb(0, 0, 0);">3923</span> <span style="color: rgb(0, 0, 0);">);<br />         approxItem.setExpose(</span> <span style="color: rgb(0, 0, 0);">0.23</span> <span style="color: rgb(0, 0, 0);">);<br />         approxItem.setMap(</span> <span style="color: rgb(0, 0, 255);">new</span> <span style="color: rgb(0, 0, 0);"> HashMap());<br />         ApproxInfo approxInfo </span> <span style="color: rgb(0, 0, 0);">=</span> <span style="color: rgb(0, 0, 0);"> </span> <span style="color: rgb(0, 0, 255);">new</span> <span style="color: rgb(0, 0, 0);"> ApproxInfo();<br />         approxInfo.setBirth(</span> <span style="color: rgb(0, 0, 0);">111</span> <span style="color: rgb(0, 0, 0);">);<br />         approxInfo.setIDno(</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">aaa</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">);<br />         approxItem.getMap().put(</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">ss</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">, approxInfo);<br />         approxInfo.setBirth(</span> <span style="color: rgb(0, 0, 0);">222</span> <span style="color: rgb(0, 0, 0);">);<br />         approxInfo.setIDno(</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">bbb</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">);<br />         approxItem.getMap().put(</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">dd</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">, approxInfo);<br />         approxItem.setList(</span> <span style="color: rgb(0, 0, 255);">new</span> <span style="color: rgb(0, 0, 0);"> ArrayList(</span> <span style="color: rgb(0, 0, 0);">1</span> <span style="color: rgb(0, 0, 0);">));<br />         approxItem.getList().add(approxInfo);<br />         System.out.println(</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">JOXUtils.toXML(approxItem)=</span> <span style="color: rgb(0, 0, 0);">"</span> <span style="color: rgb(0, 0, 0);">);<br />        System.out.println(JOXUtils.toXML(approxItem));<br />     }<br /></span> </div> <br /> Wutka Consulting˜q˜æä¾›äº†(ji¨£n)一个比较有­‘£çš„工具åQŒJava2DTDåQŒè‡ªä»Žä‹É用JDO做持久层框架åQŒæˆ‘ž®×ƒ¸€ç›´æƒ³æ‰¾ä¸€ä¸ªè¿™æ ïL(f¨¥ng)š„工具åQŒå› ä¸ºJDO的映ž®„æ–‡ä»¶åÆˆæ²¡æœ‰ž®†å…¨éƒ¨çš„JavaBean¾cÀL˜q°åˆ°.jdoæ–‡äšgåQŒæ‰€ä»¥åœ¨¾~–程环境下一直无法获取所有的实体¾cÕd’Œå­—段的一个描˜q°æƒ…å†üc(di¨£n)€‚废话少è¯ß_(d¨¢)¼Œé©¬ä¸Šè¯•一下。运行时需è¦?个包文äšgåQšbeantodtdåQŒéœ€è¦è{换的实体classesåQŒdtdparserã€?br /><br /><code></code><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: rgb(0, 0, 0);">java </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">cp beantodtd</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1.0</span><span style="color: rgb(0, 0, 0);">;classes;d:</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">policy38</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">lib</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">dtdparser121.jar; BeanToDTD </span><span style="color: rgb(0, 0, 0);">\n<br />  -</span><span style="color: rgb(0, 0, 0);">mixed com.greatwall.csi.bs.model.PersonBase</span></div><br /><p>-mixed参数是指定按JavaBean中的变量名生成属性,˜q˜æœ‰äº›å…¶å®ƒçš„参数åQŒå¯ä»¥æŽ§åˆ¶å¤§ž®å†™å’Œè¿žå­—符åïL(f¨¥ng)­‰ã€‚另外由于我用的实体是JDO增强˜q‡çš„classæ–‡äšgåQŒæ‰€ä»¥classpath˜q˜éœ€è¦åŠ ä¸ŠJDO实现的包ã€?/p><p><br /></p><p>˜qè¡Œçš„结果有ž®‘少无奈åQŒå› ä¸ºå¯¹äºŽJavaBean中List˜q™æ ·çš„容器字ŒD늱»åž‹ï¼Œæ— æ³•让它识别出对象的¾cÕdž‹åQŒåªèƒ½ç”Ÿæˆç±»ä¼?lt;!ELEMENT pension ANY>˜q™æ ·çš„æ˜qŽÍ¼Œå¦‚果在一个什么配¾|®æ–‡ä»¶ä¸­å¯ä»¥è®„¡½®çš„话那就更好äº?ji¨£n)ã€?/p><p>另外˜q˜æœ‰ä¸€ä¸ªDTD解析工具åQŒå¯ä»¥è§£æžDTDæ–‡äšgåQŒç›®å‰è¿˜ä¸çŸ¥é“有什么其它用途,使用如下æ–ÒŽ(gu¨©)³•可以解析后输出控制台åQ?/p><blockquote><p></p><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">java </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">classpath d:</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">policy38</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">lib</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">dtdparser121.jar com.wutka.dtd.Tokenize code.dtd</span></div><br /></blockquote><p>资源åQ?/p><p><a >http://www.wutka.com/download.html</a></p><img src ="http://www.aygfsteel.com/ideame/aggbug/105953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ideame/" target="_blank">ideame</a> 2007-03-23 19:02 <a href="http://www.aygfsteel.com/ideame/archive/2007/03/23/105953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jdk1.5¾~–译错误åQšvarargs æ–ÒŽ(gu¨©)³•的非 varargs 调用http://www.aygfsteel.com/ideame/archive/2007/03/23/105849.htmlideameideameFri, 23 Mar 2007 07:10:00 GMThttp://www.aygfsteel.com/ideame/archive/2007/03/23/105849.htmlhttp://www.aygfsteel.com/ideame/comments/105849.htmlhttp://www.aygfsteel.com/ideame/archive/2007/03/23/105849.html#Feedback0http://www.aygfsteel.com/ideame/comments/commentRss/105849.htmlhttp://www.aygfsteel.com/ideame/services/trackbacks/105849.html错误信息åQ?/p>

警告åQ?最后一个参æ•îC‹É用了(ji¨£n)不准¼‹®çš„变量¾cÕdž‹çš?varargs æ–ÒŽ(gu¨©)³•的非 varargs 调用åQ?br />[javac] 对于 varargs 调用åQŒåº”使用 java.lang.Object
[javac] 对于é?varargs 调用åQŒåº”使用 java.lang.Object[]åQŒè¿™æ ·ä¹Ÿå¯ä»¥æŠ‘制此警å‘?/font>

½E‹åºæ˜¯ä¸€æ ïL(f¨¥ng)š„åQŒåœ¨jdk1.4下可以编译通过åQŒä½†åœ?.5ž®×ƒ¸è¡Œã€‚上¾|‘查äº?ji¨£n)一下,解决办法åQ?/p>

 Method method  =  cls.getMethod( " hashCode " ,  new  Class[ 0 ]);  //  ¾~–译通过
Method method  =  cls.getMethod( " hashCode " ,  null );  //  ¾~–译å¤ÞpÓ|

allMethod[i].invoke(dbInstance, 
new  Object[]{});  //  ¾~–译通过
allMethod[i].invoke(dbInstance,  null );  //  ¾~–译å¤ÞpÓ|





]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÄôÈÙÏØ| Ó¦³ÇÊÐ| °¢À­¶ûÊÐ| ¼ÎÓãÏØ| ÌÒÔ°ÊÐ| ½¨ÑôÊÐ| ÁÙä¬ÏØ| ³¤Í¡ÏØ| ´Ó½­ÏØ| ¶«·½ÊÐ| Æû³µ| ɽ¶«Ê¡| ºÍÌïÏØ| Õû¯ÊÐ| Èʲ¼ÏØ| ÆîÁ¬ÏØ| ÔÆ¸¡ÊÐ| ³¤ÄþÏØ| ÃÚÑôÏØ| Т¸ÐÊÐ| ÔóÖÝÏØ| ͬÐÄÏØ| ´íÄÇÏØ| ³¤Ô«ÏØ| Î÷ÎÚÖéÄÂÇ߯ì| ÍòÊ¢Çø| Äþ¹úÊÐ| À¼ÏªÊÐ| ¹Ì°²ÏØ| ÖÜÖÁÏØ| ÉϺ¼ÏØ| ¡°²ÏØ| Õű±ÏØ| ²ÔÎàÏØ| Ìì¾þÏØ| ÐÂÃÜÊÐ| ÷ÖÝÊÐ| ÐÂÁúÏØ| ÆÁ¶«ÏØ| ´ó°²ÊÐ| ÄÏÑôÊÐ|