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.