2010-03-12 4 views
1

여러 빌드를 가질 필요없이 여러 버전의 Java ME를 지원할 수 있기를 원합니다. 나는 이미 how to detect the profile/configuration/supported JSRs을 알고있다. 내 문제는 JSR이 런타임에 지원되는지 여부를 알면 Java-ME가 리플렉션을 지원하지 않기 때문에 모든 기능을 사용할 수 없다는 것입니다.JavaME에서 별도 빌드가없는 여러 버전 지원

코드에서 아무 곳이나 나중에 실행되는 기능 (심지어 실행되지 않는 위치)에 함수를 추가하면 일부 JVM에서 해결 중에 오류가 발생할 수 있습니다. 이거 어떤 방법이 있을까요?

관련 질문

답변

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을 호출하여 정적 블록이 즉시 실행되는지 확인합니다. 충돌이 발생하지 않으면 S의 메서드를 사용하여 간접적으로 클래스 C을 사용할 수 있습니다.

기본적으로, 공용 추상 클래스 A 패키지에 민간 구상 서브 클래스 S으로, 새로운 패키지 P를 만듭니다

또한, 우리는 방법 here를 사용할 수 있습니다. A에는 인스턴스화 중에 예외가 throw 된 경우 의 인스턴스가 S 또는 null 인 정적 메서드가 있습니다. S의 각 인스턴스는 C의 인스턴스를 가지므로 C을 사용할 수없는 경우 인스턴스화에 실패합니다. 그렇지 않으면 성공합니다. 이 방법은 S (그리고 따라서 모든 C API)이 조금 비싸기 때문에 패키지 전용입니다.