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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java $ class_java文件编译后额外生成的$1.class是怎么一回事 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。