2009-08-31 6 views
1

Je voudrais pouvoir faire quelque chose comme (pseudo-code):Est-il possible de détecter si une classe est disponible en Java?

if (classAvailable) { 
    // do a thing 
} else { 
    // do a different thing 
} 

Quelle serait encore mieux si je pouvais étendre une classe de ClassA si elle est disponible ou ClassB, si ce ne . Je soupçonne que ce n'est pas possible cependant.

+1

Qu'est-ce que signifie 'disponible'? Les chargez-vous par réflexion? –

+0

J'écris une bibliothèque pour Android. Depuis Android 1.5 il y a une classe appelée AsyncTask que je voudrais utiliser si elle est disponible, sinon je voudrais pouvoir utiliser une classe non native qui fait la même chose. Je préférerais le natif puisque cela sera (probablement) maintenu. –

Répondre

1

Je ne pense pas qu'il y ait un moyen de choisir dynamiquement la possibilité d'étendre une classe ou d'une autre, sauf si vous avez fait un programme qui peut manipuler directement bytecode (simple, exemple: maintenez le bytecode compilé pour les deux versions de la sous-classe en tant que chaînes, et utilisez simplement un ClassLoader pour charger celui qui correspond à la superclasse dont vous disposez).

Vous pouvez le faire en Python, bien ;-)

6

Vous pouvez faire la première partie:

try { 
    Class.forName("my.ClassName"); 
    // It is available 
} 
catch (ClassNotFoundException exception) { 
    // It is not available 
} 
+0

Cela n'aidera pas si elle essaie encore de le référencer statiquement ... –

+1

Une référence 'my.ClassName' statique ne pourra tout simplement pas être compilée si la classe n'est pas disponible au moment de la compilation. C'est un non si la classe "peut" ou "ne peut pas" être disponible. –

2

Mon approche habituelle est à ce:

séparé le code qui utilise la bibliothèque en option dans un répertoire autre source. Il devrait implémenter des interfaces et dépend généralement du répertoire source principal. Pour appliquer des dépendances dans la construction, compilez le répertoire source principal sans la bibliothèque facultative, puis la source qui dépend de la bibliothèque facultative (avec un autre fichier de classe provenant d'un autre répertoire source et la bibliothèque sur le chemin de classe du compilateur) .

La principale source devrait tenter de charger une seule classe racine dans le répertoire source en option dynamiquement (Class.forName, asSubclass, getConstructor, newInstance). L'initialisateur statique de la classe racine doit vérifier que la bibliothèque est réellement disponible et lancer une exception si ce n'est pas le cas. Si la classe racine ne se charge pas, suivez éventuellement le modèle Null Object.

0

Si vous utilisez Spring, essayez d'utiliser org.springframework.util.ClassUtils # IsPresent

Questions connexes