我正在研究一個項目,其中有很多由庫創建的對象,並且我無法訪問這些對象的創建過程。是否有可能在Java中運行時實現接口?
下面的片段可以作爲一個很好的例子來說明我的問題。
代碼:
public class Clazz {
//The contents of Clazz are irrelevant
//Clazz is NOT my class. I have no access to its internal structure.
//However, I do have access to Clazz objects that were created elsewhere.
}
ExampleInterface
是clazz中可能會或可能不會在編譯時實現一個接口。
代碼:
public interface ExampleInterface {
public void run();
}
下面的代碼是,我遇到了這個問題。看看下面的注意事項:
run()
當c是ExampleInterface
一個實例只調用。getRunConditions(Clazz c)
和executeClazz(Clazz c)
都是我無權訪問的類中的私有方法。- 在編譯時,
Clazz
將而不是包含一個名爲run()
的方法。 - ExampleExecutor是不是我的班。我無法使用任何 方式(我甚至無法獲得該類的實例)。
代碼:
public class ExampleExecutor {
public void executeClazz(Clazz c) {
if ((c instanceof ExampleInterface) && getRunConditions(c)) {
ExampleInterface ex = (ExampleInterface) c;
ex.run();
}
}
}
顯然以下方法在語法上不能夠,但它確實是我想要的目的。基本上,如果c尚未實現ExampleInterface
,請將c設置爲執行ExampleInterface
,然後提供必須覆蓋的方法。
需要注意以下的:
extendInterface(
Name of Interface
)
是虛構的語法,試圖說明我的目標創造我 。run()
必須在這裏定義(在運行時)。- 我不能使用包裝或代理類作爲解決方案。 IE,
Clazz
對象必須結束執行ExampleInterface
,並且我無法使用解決方法。 (參考this link如果你想知道爲什麼)。
代碼:
public void implementInterface(Clazz c) {
if (!(c instanceof ExampleInterface)) {
c.extendInterface(ExampleInterface {
@Override
public void run() {
//code
}
});
}
}
爲了澄清,我正在運行到的問題是,我需要總是知道什麼時候run()
被稱爲Clazz
。如果Clazz
曾經不執行ExampleInterface
,我不知道什麼時候應該調用run()
。
與此同時,我還想偶爾爲run()
添加支持,默認情況下不支持。因爲我無法訪問創建Clazz
對象,所以我無法通過自己實現接口來完成此操作。
問題:簡單地說,是否可以在運行時實現接口(並提供所需的方法)?
注:而唯一的解決方案可能需要反思(如果有的話,請張貼下文),我使用的庫有安全管理器,阻止使用所有的反射。 IE,反思性的解決方案在將來可能對其他人有用,但對我來說沒用。
此外,我並不是說只在自己的程序中使用庫。一個已經運行的主機應用程序(這是我使用的庫)是遵循並且然後運行我爲它編寫的代碼。如果該應用程序不喜歡我提供的任何代碼(IE,與其安全管理器衝突),則代碼甚至從不編譯。
爲什麼我需要這樣做:
它與我使用的圖書館做。因爲ExampleExecutor
是我無法訪問的方法,而且我無法控制Clazz的創建,所以無法確定run()
何時執行。
我需要知道什麼時候run()
被執行的原因是因爲實際上,run()
是一個事件處理程序,它是我正在使用的庫的一部分。
例如:mouseClicked(CustomMouseEvent evt)
可能是一個方法,它是接口CustomMouseListener
的一部分。有時Clazz
的實例當鼠標點擊時(因此繼承CustomMouseListener
),我正在小心處理,而其他時間則不會。
與Clazz
實例不同,我總是在意鼠標是否被點擊,並始終需要觸發該事件。
在現實中,ExampleInterface
實際上是以下幾點:
public interface CustomMouseListener {
public void mouseClicked(CustomMouseEvent evt);
public void mousePressed(CustomMouseEvent evt);
public void mouseReleased(CustomMouseEvent evt);
//etc
}
要說清楚,你是不是在問匿名課程? http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html –
你可以用'new SomeInterface(){...}'在運行時創建一個實現接口的實例,但它贏得了' t是其他任何東西的實例(當然除了Object和超接口)。這聽起來像你正在獲取某個類的實例,只需要檢查它是否實現了一個特定的接口,如果是的話,就用它做些什麼。是對的嗎? –
不,不。參考我已經鏈接的其他問題,這可能會對我正在努力完成的事情有所瞭解。 代碼'if(c extends ExampleInterface){'已被內部庫調用。我需要確保如果Clazz在編譯時沒有實現'ExampleInterface',我可以強制它在運行時執行此操作。 – user3144349