2011-05-29 115 views
3

我的代碼被用作兩個大版本的一部分並與外部接口交互。 在其中一個版本中添加了新的API(我需要調用一個新的方法)。JAVA 僅在運行時編譯函數

我想阻止保持我的代碼兩個版本,並使用if語句:

If VersionX 
    Do Method1() 
If VersionY 
    Do Method2() 

假設method2()是新的功能,我需要調用,是有辦法的代碼只能在編譯運行時(意味着如果我在VersionX系統上運行,那麼編譯和異常沒有問題,儘管method 2()在那裏不存在)?

+0

您可以通過interfaceClass.class.getMethod(「xxx」,params)檢查接口中是否存在該方法,並捕獲該異常。或者,您可以調用方法並捕獲LinkageError(NoSuchMethodError)(設置一個靜態布爾值,不要再調用該方法,具體取決於值) – bestsss 2011-05-29 09:16:52

回答

4

你可以用一個接口和兩個類實現這一點:

interface API { 
    void Method(); 
} 

class APIX implements API { 
    void Method() { 
     someInstance.Method1(); 
    } 
} 

class APIY implements API { 
    void Method() { 
     anotherInstance.Method2(); 
    } 
} 

然後根據當前的版本,您可以創建任何APIX的APIY一個實例:

API api; 
if (isVersionX) 
    api = new APIX(); 
else 
    api = new APIY(); 
api.Method(); 

此代碼是針對包含這兩種方法的較新API編譯的。由於只能按需加載類,因此只有舊API可用並且在運行時沒有任何衝突時纔會加載使用較新方法的類。

+0

好主意,我會嘗試一下,感謝解決方案! – Eyal 2011-05-29 08:19:16

0

如果存在,您可以使用反射來調用該方法。

// calls a method if it exists or throws an exception. 
Method method = object.getClass().getMethod("DoMethod1"); 
method.invoke(object); 
+0

另一個好主意,我也會試試!謝謝! – Eyal 2011-05-29 08:19:35