開發(fā)出高質(zhì)量的系統(tǒng)
posted on 2007-07-05 01:00 dreamstone 閱讀(1768) 評(píng)論(14) 編輯 收藏 所屬分類: jdk相關(guān)
估計(jì)可能在null==getMyInt();這里的時(shí)候,getMyInt()不存在,直接為null吧?大概,需要測(cè)試一下。 回復(fù) 更多評(píng)論
沒(méi)必要打包成jar都有這個(gè)現(xiàn)象,將MyInt.class刪除也一樣。MyInt從來(lái)沒(méi)有被連接過(guò)(link),僅僅是被嘗試裝載(load),而裝載MyInt類但是沒(méi)有使用是不會(huì)拋出NoClassDefFoundError的。 回復(fù) 更多評(píng)論
將iface.jar移走后,如果不重新編譯的話,程序依然能夠運(yùn)行,true null,(我直接用的類,沒(méi)打包)。其實(shí)當(dāng)你把iface.jar移走后沒(méi)有重新編譯,如果重新編譯就能看到會(huì)報(bào)錯(cuò)的(找不到MyJar)。你使用的應(yīng)該是舊的class文件。我估計(jì)可能getMyInt()都沒(méi)有執(zhí)行,找不到就為null了。要知道具體原因可能需要打開class文件具體查看一下了。 回復(fù) 更多評(píng)論
getMyInt()是肯定有執(zhí)行,不信你可以在getMyInt加個(gè)System.out.println("getMyInt()");看看,原因俺已經(jīng)說(shuō)明了,更深入地請(qǐng)看《深入Java虛擬機(jī)》,常量池中的MyInt雖然被裝載(裝載失敗),但沒(méi)有使用,沒(méi)有被連接、解析并初始化,可以簡(jiǎn)單地把它當(dāng)成一個(gè)符號(hào)罷了 回復(fù) 更多評(píng)論
懶惰加載, 優(yōu)化過(guò)的代碼, JVM 會(huì)走捷徑. 回復(fù) 更多評(píng)論
我沒(méi)有打包,而是直接運(yùn)行的。現(xiàn)在說(shuō)說(shuō)我的看法。 1 編譯好的字節(jié)碼中可能儲(chǔ)存了信息。具體的我也說(shuō)不出來(lái)... !-- 2 當(dāng)你 javac Test的時(shí)候,它先是自動(dòng)搜索當(dāng)前有無(wú)編譯好的字節(jié)碼,如果沒(méi)有話,才會(huì)重新編譯,所以它會(huì)從之前的字節(jié)碼中讀出信息來(lái)參與編譯。 可以用一個(gè)方法來(lái)測(cè)試,就是在當(dāng)前的classpath下,刪除掉MyJar.class,MyInt.java更換一個(gè)package的時(shí)候,就會(huì)發(fā)現(xiàn),無(wú)法通過(guò)編譯! 呵呵,不知道我的想法對(duì)你有沒(méi)有幫助! 回復(fù) 更多評(píng)論
@dennis 打包只是為了模擬一個(gè)需求。怎么能說(shuō)沒(méi)被使用呢 isMyInterface()是調(diào)用了getMyInt()的。 執(zhí)行isMyInterface()沒(méi)問(wèn)題, 執(zhí)行g(shù)etMyInt()有問(wèn)題。這個(gè)怎么解釋,呵呵 回復(fù) 更多評(píng)論
@劉明 你可以測(cè)試一下,是可以重新編譯的。至少在eclipse是可以的。 你可以直接刪掉.class文件,讓他重新編譯出來(lái) 回復(fù) 更多評(píng)論
@dennis 相對(duì)比較贊同這個(gè)觀點(diǎn),不過(guò)為什么調(diào)用getMyInt()會(huì)出錯(cuò)呢。根本編譯不了。呵呵。 回復(fù) 更多評(píng)論
@BeanSoft 好像不是,我取了字節(jié)碼看,還是有這個(gè)接口的。不過(guò)考慮可能是load失敗,但是判斷null==A的時(shí)候,根本不管是個(gè)什么什么東西,只要知道它不是null就直接得出結(jié)論。因?yàn)閚ull的==是比較特殊的。不過(guò)這也是猜測(cè),沒(méi)有有力的證明 回復(fù) 更多評(píng)論
@李敏 恩,我明白你的意思。不過(guò)我說(shuō)的特殊點(diǎn)在這里: c是test b是isMyInterface() a是getMyInt() c調(diào)用b b調(diào)用a能成功 c直接調(diào)用a不能成功。 而且都是putlic static 的函數(shù), 回復(fù) 更多評(píng)論
另外提供一個(gè)信息,同樣的代碼和執(zhí)行方式 在ibm aix上使用ibm sdk得到的結(jié)果是不一樣的,就是執(zhí)行isMyInterface() 也出錯(cuò),呵呵。這個(gè)才是起因。 回復(fù) 更多評(píng)論
load失敗拋出錯(cuò)誤的時(shí)間,不同jdk實(shí)現(xiàn)不同,有的是一失敗就馬上給出NoClassDefFoundError,有的是延遲到使用該類的時(shí)候再報(bào)錯(cuò)。為什么不能調(diào)用getMyInt?編譯不能通過(guò)啊,編譯過(guò)程中編譯器會(huì)查找所有出現(xiàn)的符號(hào)是否存在。 回復(fù) 更多評(píng)論
這個(gè)問(wèn)題,你再看下《深入java虛擬機(jī)》連接和初始化那個(gè)章節(jié)就明了了 回復(fù) 更多評(píng)論
Powered by: BlogJava Copyright © dreamstone