java $ class_java文件编译后额外生成的$1.class是怎么一回事
首先java文件編譯生成class文件其基本規(guī)則是這樣的:
內(nèi)部類的class文件命名是:主類+$+內(nèi)部類名
匿名類的class文件命名是:主類+$+(1,2,3....)
但是如果沒有使用匿名類,會(huì)生成帶$1.class文件么~~答案是會(huì)的。
先來看這樣一段代碼~
public class TestJavac
{
void Test()
{
innerClass lklk = new innerClass();
lklk.biubiu();
}
private class innerClass
{
private innerClass()
{
// TODO 自動(dòng)生成的構(gòu)造函數(shù)存根
}
void biubiu()
{
System.out.println("XXXX");
}
}
}
此java文件經(jīng)過javac編譯后(注意是手動(dòng)使用javac編譯或者使用ant編譯)應(yīng)該生成幾個(gè)class文件呢?
TestJavac.class
TestJavac$innerClass.class
這兩個(gè)你肯定知道,但是還會(huì)生成一個(gè)TestJavac$1.class
這玩意兒是怎么來的?
將其反編譯內(nèi)容為~~空的class TestJavac$1
{
}
但是eclipse編譯后就沒有TestJavac$1.class這個(gè)文件,這究竟是嘛回事兒呢?
當(dāng)內(nèi)部類是私有的且沒有明確書寫公有的構(gòu)造函數(shù)時(shí),那么缺省構(gòu)造函數(shù)就是私有的,javac對(duì)這種情況的處理就是創(chuàng)建一個(gè)可以訪問的帶有一個(gè)參數(shù)的構(gòu)造函數(shù),而這個(gè)參數(shù)的類型是一個(gè)匿名的靜態(tài)類,所以編譯時(shí)就會(huì)多生成一個(gè)匿名類的class文件,所以生成了XXX$1.class文件。
有人說JDK1.4才會(huì)有這種情況,但我的javac版本是1.6.0_21,也會(huì)有此問題。
Eclipse JDT使用的編譯器與JDK提供的javac是不一樣的,EclipseJDT使用的是它自己內(nèi)建的編譯器ecj(theEclipse Compiler for Java)或者說JDT Core Batch Compiler也行。有一些增強(qiáng)的功能,包括對(duì)上述情況的完美處理(不會(huì)憑空給你增加一個(gè)匿名類)。
想規(guī)避這種情況很簡(jiǎn)單:
1、內(nèi)部類設(shè)為公有。
2、明確的書寫內(nèi)部類的構(gòu)造函數(shù)并設(shè)置其可見性為public。3、使用其它的java編譯器如JDT里的ecj。
對(duì)于如何在ANT中使用JDT的java編譯器可以參考這篇文章
個(gè)人感覺:不是SUN的javac太差了,而是IBM的eclipse太強(qiáng)了~~
總結(jié)
以上是生活随笔為你收集整理的java $ class_java文件编译后额外生成的$1.class是怎么一回事的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js方法写在html中,在js中写htm
- 下一篇: 利用Jackson的JsonFilter