2011-11-23 80 views
1

是否有可能在保留原始名稱的同時在java中擴展類?如果現在我可以添加到該類的額外功能(注意這個類是由android sdk提供的,它的視圖類)擴展類,同時保留在java中的名稱

+0

這是不可能的,但也許如果你可以描述你想要在更高的層次上做什麼,那麼有人可以建議一個替代方法來完成你想要完成的任務。 – goto10

+0

@ goto10例如我想添加一個函數到View類的android,但我不想擴展它,並使用新的類名。 –

+0

我很瞭解。但是,你能用更一般的術語來描述你的目標嗎? 「我希望所有的觀點都是紫色的。」 「我希望所有的視圖彈出一個消息框,當我點擊它們時,會顯示'嗨'。」你想要的具體技術解決方案是不可能的,但可能有另一種方法來實現你的目標。 – goto10

回答

4

不,Java中的類不是「可重新打開的」。擴展是一個新類。

(一個警告,通過背叛你也許可以添加字節碼,但沒有將能夠在編譯時訪問它。)

+0

同意。 Java中沒有類似於Objective-C「類別」的東西。 –

+0

在Android上添加字節碼是不可能的 –

+0

@MikeG [This](http://groups.google.com/group/android-platform/browse_thread/thread/21549d6f3228eb50?pli=1)似乎不同意。無論哪種方式,它取決於何時以及如何添加它。就像我所說 - 無論如何不會在編譯時提供。 –

0

當你擴展中的Java類,您可以通過創建這樣做一個新名字的新班級。 ex:

public class MySpecialView extends View 

擴展類未被修改。

3

只有當它位於不同的包中時,纔可以這樣做。 (也就是說,它可以有相同的簡單的名字,但不是同一個合格的名稱。)

package com.me; 

class Number extends java.lang.Number { 
    // ... 
} 
+0

謝謝你。剛花了一個小時解決了一個完全無關的問題,這個答案讓我走上了正確的軌道。 – velis

0

我假定你的意思是完全合格的名稱(FQN =包+類名)。所以,不,你不能,而你真的不應該。這就是首先要有一個包名稱。

但是,如果您堅持這樣做,您可以使用相同的包和相同的名稱創建一個新的類,從原始源代碼開始(假設您擁有它)並更改您需要的任何功能。根據類路徑順序(通常您的源代碼優先於任何包含的庫,但您必須確保它是如此),類加載器將選擇您的類而不是原來的類。但這更像是一種黑客行爲,我強烈建議避免它,除非您確切知道自己在做什麼,因爲您可能會遇到各種意想不到的行爲。