mar.
2010
Java Quiz #36
Pour créer des instances de classes dont on ne connait que le nom, rien de plus facile : il suffit de récupérer l'instance de Class<?>
puis d'appeler newInstance()
dessus, et puis de traiter les nombreuses exceptions susceptibles d'être levées.
C'est ce que fait la méthode statique newInstance
ci-dessous :
public class TestNewInstance { public static void main(String[] args) { final Object o = newInstance(args[0]); System.out.println(String.valueOf(o)); } private static Object newInstance(String className) { try { Class<?> clazz = Class.forName(className); return clazz.newInstance(); } catch (ClassNotFoundException e) { System.out.println("-- Class Not Found --"); } catch (IllegalAccessException e) { System.out.println("-- Illegal Access --"); } catch (InstantiationException e) { System.out.println("-- Cannot Instantiate --"); } return null; } }
Bien sûr, la classe en question doit posséder un constructeur sans argument ; si ce n'est pas le cas, InstantiationException
sera levée.
Cependant, malgré toutes ces précautions, ce code pose un gros problème de robustesse, qui ne se révèle que pour quelques classes bien particulières. Pourquoi ? Comment l'éliminer ?