日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java $.class_java文件编译后额外生成的$1.class是怎么一回事

發布時間:2025/4/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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是怎么一回事的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。