2010-03-12 18 views
1

Je souhaite pouvoir prendre en charge plusieurs versions de Java ME sans avoir besoin de plusieurs générations. Je connais déjà how to detect the profile/configuration/supported JSRs. Mon problème est que savoir si la JSR est supportée au moment de l'exécution ne me permet pas d'utiliser toutes les fonctionnalités car Java-ME ne supporte pas la réflexion. Car si j'appelle une fonction ajoutée dans une version ultérieure n'importe où dans le code - même un emplacement qui ne sera jamais exécuté, cela pourrait provoquer une erreur lors de la résolution sur certaines machines JVM. Y a-t-il un moyen de contourner cela?Prise en charge de plusieurs versions sans générations distinctes dans JavaME

Questions connexes

Répondre

1

Si vous avez seulement besoin d'accéder à la classe C via une interface que vous savez que vous aurez accès à, il est assez simple:

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

Si C n'a pas Une interface qui peut être utilisée, alors nous pouvons créer à la place une classe wrapper S qui sera un membre de l'interface à la place.

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 a un bloc statique de sorte qu'une exception est levée lors de la résolution de classe si C est indisponible. Immédiatement après le chargement de la classe, nous appelons forceExceptionIfUnavailable pour nous assurer que le bloc statique est exécuté immédiatement. Si elle ne plante pas, nous pouvons utiliser les méthodes de S pour utiliser indirectement la classe C.

Sinon, nous pouvons utiliser la méthode here:

Fondamentalement, vous créez un nouveau package P, avec une classe abstraite publique A et une sous-classe concrète S privé à l'emballage. A a une méthode statique getS qui renvoie une instance de S ou null si une exception est levée pendant l'instanciation. Chaque instance de S possède une instance de C. Par conséquent, il échouera à instancier lorsque C est indisponible, sinon il réussira. Cette méthode semble être un peu plus sûre car S (et donc toutes les API C) sont privées.