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