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