Instanciation dynamique

Fermé
sisi - 13 févr. 2013 à 12:27
 sisi - 13 févr. 2013 à 23:09
Bonjour tout le monde,

Mon problème est que je n'arrive pas a comprendre la différence entre une instanciation dynamique et une instanciation normale en utilisant le mot clé "new".

D'après ce que j'ai compris:

dans l'instanciation dynamique je peux avoir les informations de ma classe (la liste des interfaces, des méthodes...etc) on utilisant la méthode getClass(). je récupère le constructeur puis on invoque la méthode "tostring"
1. est ce que cette class dont je veux instancier dois êtres dans le même projet dont je travaille?
2. si c'est la cas alors je peux utiliser le mot clé "new" pour l'instancier pourquoi je dois passer par l'instanciation dynamique?

SVP s'il y a quelqu'un qui peut m'aider.
Je vous remercie.



A voir également:

2 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
13 févr. 2013 à 14:40
"dans l'instanciation dynamique je peux avoir les informations de ma classe (la liste des interfaces, des méthodes...etc) on utilisant la méthode getClass()"
Ce genre de manipulations, tu peux les faire tout le temps, la méthode getClass est définie dans la classe Object et est donc accessible par tous les objets.
L'instanciation dynamique n'a aucun rôle particulier dans ce processus.

"1. est ce que cette class dont je veux instancier dois êtres dans le même projet dont je travaille?"
Pas forcément, en utilisant des ClassLoader par exemple, on peux ajouter dynamiquement des classes, en lisant directement les fichiers .class

"2. si c'est la cas alors je peux utiliser le mot clé "new" pour l'instancier pourquoi je dois passer par l'instanciation dynamique?"
Justement, ce n'est pas le cas ! De plus, même si ta classe est quand même dans ton projet au départ, il y a certains cas où l'on ne connait pas à l'avance quelle classe il faut instancier, c'est donc impossible de faire une instanciation avec new.

Exemple, on instancie des objets dont le nom de la classe est passée en argument du programme.

public class Test
{
public static void main(String[] args)
{		
	System.out.println(args.length+" arguments");
	
	for (int i=0; i<args.length; i++)
	{
		System.out.println("\nargument "+i+" : "+args[i]);
		
		try 
		{
			Class<?> c = Class.forName(args[i]);
			Object obj = c.newInstance();
			System.out.println("newInstance : "+obj);
		} 
		catch (Exception e)
		{
			System.out.println(e);
		}
	}
}
}

Exemple, d'exécution :
java Test java.lang.String java.util.LinkedList javax.swing.JPanel
Ce qui donne :

3 arguments

argument 0 : java.lang.String
newInstance : 

argument 1 : java.util.LinkedList
newInstance : []

argument 2 : javax.swing.JPanel
newInstance : javax.swing.JPanel[,0,0,0x0,invalid,layout=java.awt.FlowLayout, alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
0
Merci bcp pour votre réponse, c'est vraiment bien claire maintenant pour moi.

Pour l'exemple: est ce que le premier et le deuxième argument on ne peu pas les instancier?pourquoi il n'a rien affiché?

est ce que vous pouvez m'expliquer le résultats d'instance du troisième arguments

argument 2 : javax.swing.JPanel
newInstance : javax.swing.JPanel[,0,0,0x0,invalid,layout=java.awt.FlowLayout, alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]

Merci infiniment
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
13 févr. 2013 à 15:53
"est ce que le premier et le deuxième argument on ne peu pas les instancier?"
On pourrait tous les 3 les instancier, si on s'avait À L'AVANCE quel serait leurs valeurs.
Mais dans la mesure où c'est l'utilisateur qui détermine quelle classe il va mettre en argument, on ne peut pas le coder en direct, car ça changera à chaque fois.
Comme exemple, j'avais pris "java Test java.lang.String java.util.LinkedList javax.swing.JPanel"
Mais on pourrait mettre n'importe quoi à la place, et c'est pour ça que l'on ne pourrait pas les remplacer dans le code. Faire un "new String" à la place de la première instanciation dynamique n'aurait plus aucun sens si ensuite je fait : "java Test java.util.Date Test java.util.TreeSet"

"pourquoi il n'a rien affiché? est ce que vous pouvez m'expliquer le résultats d'instance du troisième arguments"
Le println utilise la méthode toString de l'objet à afficher. Or pour le premier argument, la valeur était un String "", donc le programme a affiché "", c'est pour ça que l'on ne voit rien. De même pour la liste, par défaut elle est vide, donc on affiche seulement "[]".
Pour le troisième argument, c'est pareil, on utilise la méthode toString de l'objet à afficher, ici c'est un JPanel, donc c'est la méthode toString de la classe JPanel qui est utilisé, et on se retrouve avec un affichage spécifique aux JComponent, qui décrit dans l'ordre : le nom du JPanel (par défaut ""), les positions x et y (par défaut 0), les dimensions width et height (par défaut 0x0), etc.
0