我希望能够支持多个版本的 Java ME,而不必进行多个构建。我已经知道如何检测配置文件/配置/支持的 JSR。我的问题是知道在运行时是否支持 JSR 并不允许我使用所有功能,因为 Java-ME 不支持反射。
因为如果我在代码中的任何位置调用在更高版本中添加的函数 - 即使是永远不会运行的位置,那么这可能会在某些 JVM 的解析过程中导致错误。有没有办法解决这个问题?
相关问题
我希望能够支持多个版本的 Java ME,而不必进行多个构建。我已经知道如何检测配置文件/配置/支持的 JSR。我的问题是知道在运行时是否支持 JSR 并不允许我使用所有功能,因为 Java-ME 不支持反射。
因为如果我在代码中的任何位置调用在更高版本中添加的函数 - 即使是永远不会运行的位置,那么这可能会在某些 JVM 的解析过程中导致错误。有没有办法解决这个问题?
相关问题
如果您只需要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
}
S
C
有一个静态块,因此如果不可用,则在类解析期间引发异常。加载类后,我们立即调用forceExceptionIfUnavailable
以确保静态块立即运行。如果它没有崩溃,那么我们可以使用 in 的方法S
来间接使用 class C
。
或者,我们可以使用这里的方法:
基本上,您创建一个新的包P
,其中包含一个公共抽象类A
和一个S
私有的具体子类。A
有一个静态方法getS
,该方法返回一个实例,S
或者null
在实例化过程中是否抛出异常。每个实例S
都有一个实例,C
因此当不可用时它将无法实例化C
- 否则它将成功。这种方法似乎更安全一些,因为S
(因此所有的C
API)都是包私有的。