2011-05-29 82 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