匿名類怎麼反編譯出來
⑴ 匿名類的問題
匿名類是不能有名稱的類,所以沒辦法引用它們。必須在創建時,作為new語句的一部分來聲明它們。
這就要採用另一種形式的new語句,如下所示:
new <類或介面> <類的主體>
這種形式的new語句聲明一個新的匿名類,它對一個給定的類進行擴展,或者實現一個給定的介面。它還創建那個類的一個新實例,並把它作為語句的結果而返回。要擴展的類和要實現的介面是new語句的操作數,後跟匿名類的主體。
假如匿名類對另一個類進行擴展,它的主體可以訪問類的成員、覆蓋它的方法等等,這和其他任何標準的類都是一樣的。假如匿名類實現了一個介面,它的主體必須實現介面的方法。
注重匿名類的聲明是在編譯時進行的,實例化在運行時進行。這意味著for循環中的一個new語句會創建相同匿名類的幾個實例,而不是創建幾個不同匿名類的一個實例。
從技術上說,匿名類可被視為非靜態的內部類,所以它們具有和方法內部聲明的非靜態內部類一樣的許可權和限制。
假如要執行的任務需要一個對象,但卻不值得創建全新的對象(原因可能是所需的類過於簡單,或者是由於它只在一個方法內部使用),匿名類就顯得非常有用。匿名類尤其適合在Swing應用程序中快速創建事件處理程序。
資料引用:http://www.knowsky.com/369271.html
classnotfoundexception 是沒有找的類的意思 可能是這個類中有匿名類存在 就是別人不願意讓你知道有這個類存在 因為匿名類沒有名字所以反編譯不了 這個你就別試了
⑶ 怎麼把class文件反編譯成java文件
Java中使用eclipse提供的插件對class進行反編譯成java文件,如下步驟:
1、安裝jadclipse插件
使用jadclipse插件一定要注意Eclipse版本。jadclipse_3.2.4,它對應的是Eclipse3.2版,jadclipse_3.3.0可以用於Eclipse3.3M6以上版。大家千萬不要把jadclipse_3.3.0放到Eclipse3.2中,也不要把jadclipse_3.2.4放到Eclipse3.3中,將jadclipse插件(版本自己選擇)直接到Eclipse目錄中的plugins文件夾下,然後打開Eclipse,選擇"窗口"-"首選項"-"常規"-"編輯器"-"文件關聯",點擊文件關聯中的*.class,下面就會看到"JadClipse Class File Viewer",選中它,點擊預設值,點擊OK,將它設置為默認的類查看器。如圖:

⑷ JAVA匿名類問題
這個問題其實跟匿名類是沒有關系的,這個是多態裡面的一個問題。子類可以擴展父類,可以定義自己的方法。對於外界來說也是可見的,但是如果你採用的是多態的辦法來調用子類那麼你的子類中的定義的方法對於外界來說就是不可見的了。只能調用父類中定義過的方法,這樣就可以保證安全性。
因為 可能一個類有多個類來繼承,每個類都可以定義自己的方法,但是如果可以在父類的對象上邊調用子類自己的方法就會存在隱患。比如
public interface A{
public void a();
}
public class B extends A{
public void b(){...}
}
public class C extends A{
public void c(){...}
}
你可以使用A a=new B();
來調用B中方法,但是只能調用 a.a(),而不能調用 a.b();如果說A的對象A可以調用 a.b()的話,那麼,如果我把A的實現換成了C那麼a.b()就會出現錯誤,沒有這個方法。所以為了保證安全性,父類的對象只能調用父類中定義過的方法。
如果你用過Spring的話,那麼就能有比較深的理解。Spring中式可以通過配置來實現多態的,如果java中是可以使用a.b()這樣的話,那麼你改了Spring中的子類的配置還要去更改代碼,那麼實際上Spring也就沒有多大用處、多態也就沒有什麼優勢了~
不知道你懂了沒有~~
⑸ 如何反編譯任意文件
一般來說反編譯都是針對已知類型,例如exe之類的。
而且世上沒有純粹的新類型文件,都是某人做出來的,不會無緣無故跳出來一個新文件類型。這文件也必然是有源代碼,有編譯器。如果你沒見過這個類型,可以去網上找找,只要找到類型,就有反編譯的可能。不過不同類型區別很大。比如vb5.0和6.0隻能看到窗體,而c#就可以看到源碼。
對未知類型來說,可用ultraedit打開,查看文件頭信息,基本可以確定這是一個什麼樣的文件。
⑹ java 匿名內部類
這個沒有使用,只是把 JPanel() 的paintComponent方法重寫了下而已。
所謂匿名內部類,就是說本來已經有了個class了,這個class就是和.java文件名字
一樣的public的那個class。 然後在這個class裡面,有使用了一個只有在這個class裡面才能訪問到的類,而且直接省略了那個類的名字。好像 think in java裡面有段專門講這個的
⑺ 打擾一下,關於匿名內部類的語法,我一直弄不懂,如下例
匿名內部類顧名思義,是定一個沒有名字的內部類。
new WindowAdapter()不是抽象函數,這個語句是定一個匿名內部類的實例,這個匿名內部類是WindowAdapter的子類。後面的{}內是類的定義。使用這種語法,new 後面可以跟介面、抽象類,後面{}內,實現介面、抽象類內必須要實現的方法。
含有匿名內部類的類在編譯後,會生成多個class文件,一個是本類的class文件,其他的是匿名內部類的class文件,命名方式是:類名$1.class、類名$2.class......
⑻ 哪位給翻譯一下,反編譯的帶匿名內部類的java文件
本文通過反編譯內部類的位元組碼,
說明了內部類是如何訪問外部類對象的成員的,除此之外,
我們也對編譯器的行為有了一些了解,
編譯器在編譯時會自動加上一些邏輯,
這正是我們感覺困惑的原因。
關於內部類如何訪問外部類的成員,
分析之後其實也很簡單,
主要是通過以下幾步做到的:
1
編譯器自動為內部類添加一個成員變數,
這個成員變數的類型和外部類的類型相同,
這個成員變數就是指向外部類對象的引用;
2
編譯器自動為內部類的構造方法添加一個參數,
參數的類型是外部類的類型,
在構造方法內部使用這個參數為1中添加的成員變數賦值;
3
在調用內部類的構造函數初始化內部類對象時,
會默認傳入外部類的引用。
⑼ java 匿名內部類 的執行順序和文字表述, ,下面看代碼
內部類(理解)
(1)把類定義在另一個類的內部,該類就被稱為內部類。
舉例:把類B定義在類A中,類B就被稱為內部類。
(2)內部類的訪問規則
A:可以直接訪問外部類的成員,包括私有
B:外部類要想訪問內部類成員,必須創建對象
(3)內部類的分類
A:成員內部類
B:局部內部類
(4)成員內部類
A:private 為了數據的安全性
B:static 為了訪問的方便性
成員內部類不是靜態的:
外部類名.內部類名 對象名 = new 外部類名.new 內部類名();
成員內部類是靜態的:
外部類名.內部類名 對象名 = new 外部類名.內部類名();
局部內部類
A:局部內部類訪問局部變數必須加final修飾。
B:為什麼呢?
因為局部變數使用完畢就消失,而堆內存的數據並不會立即消失。
所以,堆內存還是用該變數,而改變數已經沒有了。
為了讓該值還存在,就加final修飾。
通過反編譯工具我們看到了,加入final後,堆內存直接存儲的是值,而不是變數名。
(7)匿名內部類(掌握)
A:是局部內部類的簡化形式
B:前提
存在一個類或者介面
C:格式:
new 類名或者介面名() {
重寫方法;
}
D:本質:
其實是繼承該類或者實現介面的子類匿名對象
(8)匿名內部類在開發中的使用
我們在開發的時候,會看到抽象類,或者介面作為參數。
而這個時候,我們知道實際需要的是一個子類對象。
如果該方法僅僅調用一次,我們就可以使用匿名內部類的格式簡化。
⑽ 創建一個匿名類的時候它的位置在哪
你的代碼中如果有匿名類,編譯器會先處理一下,把它轉換成普通的類,名字由編譯器起,這樣編譯器就把匿名類當做普通類去編譯了。
這個過程可能是編譯時直接在內存中展開的。
一般是在匿名類所在的當前類裡面,這樣才能夠訪問當前類的成員。
如果是C#,用dnspy反編譯一個帶匿名類的dll或者exe就看到編譯器展開的結果了。
