2011-10-05 161 views
0

我有一個類中的抽象方法需要在使用我的項目的SEPARATE項目中由外部類實現。(Java)爲通過反射創建的新對象創建方法?

- 所有的類的instanceof甲使用反射最初生成 -

所以無論如何,說一類是抽象的,和B類(非抽象)延伸的

B具有所有的未實現的方法在A類中,因爲B在我的工作區中,所以我知道要添加這些方法。

C也擴展了A,但是C只有A的抽象方法的一個子集,但是不在我的工作空間中。

因此,不是在一個在C中的每個抽象方法,我需要找到一些方法來添加對所提出的方法,像這樣:

(對於每一種方法)

public <corresponding return type> <missingMethodName>() { return null; } 

這是可能的?

P.S.請假設我必須完全重寫我的代碼才能與我無法控制的對象保持同步,或者實施一個類似我上面提到的解決方案。

+0

如何代碼編譯,如果'C'延伸A'''A'是抽象的,而'C'沒有實現所有抽象方法?另外,如果被調用的'super'是'A',它沒有實現,那麼如何調用'super。()'? –

+0

你的問題不是很清楚。反射允許您加載類和調用方法。但它不允許定義新的方法。你需要使用字節碼檢測來做到這一點。另外,我沒有看到工作區與此有關:工作區是IDE的一個東西。它與Java程序的執行無關。 –

+0

廢話,你是對的,這是不可能的。該類將不得不在運行時實現。該死的... – Ryan

回答

0

沒有,除非我讀你正確,什麼你問並沒有真正太大的意義。

如果你想注入的方法

public <corresponding return type> <missingMethodName>() { super.<missingMethodName>(); } 

成C,它擴展了A,在沒有實現這個方法,那會是什麼究竟做什麼?

如果你想提供一個默認的實現,那很好,而且不會影響C.如果您添加的抽象方法分爲A,C必須實現他們自己標記爲抽象的,否則將無法編譯(或者拋出序列化,或者一些奇怪的錯誤),如果你用一個用老A編譯的C運行的話。

+0

它沒有什麼意義,因爲該課程的項目設計以及autograder的工作方式非常差。我不打算深入細節......尼古拉斯已經明確表明,如果沒有C類中實際存在的未實現方法,就無法編譯。 – Ryan

0

你不應該這麼做,因爲任何實例方法都可以在子類上調用super實現實例。

您可以使用字節碼添加這些方法,但它們唯一的區別是要更改getDefinedMethods()的列表。但它不會改變類的對象的行爲。

+0

要清楚,這是錯誤的: - 邏輯上,每個A在A中有每個抽象方法。我實際創建的每個子類都使用了所有的方法。 - 自動編碼器對象不使用A中的每個抽象方法,因爲它測試的方式與我的設計不一致。 (這是他們的錯誤,因爲學生的設計依賴於提供的框架。) – Ryan

+0

如果要抽出抽象類的抽象方法,可以使用字節碼生成子類。例如ASM。但是,你自己寫作可能會更簡單。 –

0

其安靜困難,但你可以用Javassist

了Javassist(Java編程助理)做的是一個Java庫提供操作的應用程序的Java字節碼的手段。 1在這個意義上Javassist提供了用於結構反射的支持,即,以改變在運行時類的實現的能力。 字節碼操作是在加載時通​​過提供類加載器執行。 http://en.wikipedia.org/wiki/Javassist