1

我希望能够支持多个版本的 Java ME,而不必进行多个构建。我已经知道如何检测配置文件/配置/支持的 JSR。我的问题是知道在运行时是否支持 JSR 并不允许我使用所有功能,因为 Java-ME 不支持反射。

因为如果我在代码中的任何位置调用在更高版本中添加的函数 - 即使是永远不会运行的位置,那么这可能会在某些 JVM 的解析过程中导致错误。有没有办法解决这个问题?

相关问题

4

1 回答 1

1

如果您只需要C通过您知道可以访问的接口访问该类,那么它就足够简单了:

MyInterface provider=null;
try{
    Class myClass= Class.forName("sysPackage.C");
    provider = (MyInterface)(myClass.newInstance());  
}catch(Exception ex){
}
if(provide!=null){
    //Use provider
}

如果C没有可以使用的接口,那么我们可以改为创建一个包装类,该类S将成为该接口的成员。

class S implements MyInterface{
    static {
        try {
            Class.forName("sysPackage.C");
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    } 
    public static void forceExceptionIfUnavailable() {}
    //TODO: Methods that use C. Class C will only be used within this class
}   

SC有一个静态块,因此如果不可用,则在类解析期间引发异常。加载类后,我们立即调用forceExceptionIfUnavailable以确保静态块立即运行。如果它没有崩溃,那么我们可以使用 in 的方法S来间接使用 class C

或者,我们可以使用这里的方法:

基本上,您创建一个新的包P,其中包含一个公共抽象类A和一个S私有的具体子类。A有一个静态方法getS,该方法返回一个实例,S或者null在实例化过程中是否抛出异常。每个实例S都有一个实例,C因此当不可用时它将无法实例化C- 否则它将成功。这种方法似乎更安全一些,因为S(因此所有的CAPI)都是包私有的。

于 2010-03-15T00:57:29.160 回答