OVH Cloud OVH Cloud

Réflexion et instanciation

4 réponses
Avatar
Bernard Koninckx
Bonjour à tous,

Est-il possible de créer dynamiquement une instance d'inner class à partir
d'une autre que celle qui englobe l'inner class.

Ex. :
Je souhaite instancier Test3 à partir d'une classe TableModelObject.
Voici la structure :

Test
Test2
Test3 extends Test2

TableModelObject
=> essaye d'instancier un object de type Test3


Merci d'avance pour toutes vos remarques, ...

Bernard

4 réponses

Avatar
Bernard Koninckx
J'essaye en vain

Class c = Class.forName(dataObjectClass.getName());
Object o = c.newInstance();

Mais ça ne fonctionne pas ...

"Bernard Koninckx" a écrit dans le message de
news: 408a2eea$0$10949$
Bonjour à tous,

Est-il possible de créer dynamiquement une instance d'inner class à
partir

d'une autre que celle qui englobe l'inner class.

Ex. :
Je souhaite instancier Test3 à partir d'une classe TableModelObject.
Voici la structure :

Test
Test2
Test3 extends Test2

TableModelObject
=> essaye d'instancier un object de type Test3


Merci d'avance pour toutes vos remarques, ...

Bernard




Avatar
Jacques-Olivier Haenni
Bonjour,

Si Test3 est une inner class non statique de Test2, alors, lors de la
création par réflexion, il faut rajouter un argument de type Test2. Par
exemple, si Test3 a un constructeur sans argument, il faudra, par
réflexion, appeler un constructeur avec un argument de type Test2.

Cet argument supplémentaire est automatiquement rajouté par le
compilateur (sauf dans le cas de la réflexion évidemment) pour que
l'instance de l'inner classe ait une référence sur la classe englobante.

Jacques-Olivier


Bernard Koninckx wrote:
J'essaye en vain

Class c = Class.forName(dataObjectClass.getName());
Object o = c.newInstance();

Mais ça ne fonctionne pas ...

"Bernard Koninckx" a écrit dans le message de
news: 408a2eea$0$10949$

Bonjour à tous,

Est-il possible de créer dynamiquement une instance d'inner class à


partir

d'une autre que celle qui englobe l'inner class.

Ex. :
Je souhaite instancier Test3 à partir d'une classe TableModelObject.
Voici la structure :

Test
Test2
Test3 extends Test2

TableModelObject
=> essaye d'instancier un object de type Test3


Merci d'avance pour toutes vos remarques, ...

Bernard









Avatar
Bernard Koninckx
Je comprens pas tout à fait ce que tu veux dire. Pourrait tu me donner un
exemple ?

Bernard

"Jacques-Olivier Haenni" a écrit dans le
message de news: c74p2q$q0$
Bonjour,

Si Test3 est une inner class non statique de Test2, alors, lors de la
création par réflexion, il faut rajouter un argument de type Test2. Par
exemple, si Test3 a un constructeur sans argument, il faudra, par
réflexion, appeler un constructeur avec un argument de type Test2.

Cet argument supplémentaire est automatiquement rajouté par le
compilateur (sauf dans le cas de la réflexion évidemment) pour que
l'instance de l'inner classe ait une référence sur la classe englobante.

Jacques-Olivier


Bernard Koninckx wrote:
J'essaye en vain

Class c = Class.forName(dataObjectClass.getName());
Object o = c.newInstance();

Mais ça ne fonctionne pas ...

"Bernard Koninckx" a écrit dans le message
de


news: 408a2eea$0$10949$

Bonjour à tous,

Est-il possible de créer dynamiquement une instance d'inner class à


partir

d'une autre que celle qui englobe l'inner class.

Ex. :
Je souhaite instancier Test3 à partir d'une classe TableModelObject.
Voici la structure :

Test
Test2
Test3 extends Test2

TableModelObject
=> essaye d'instancier un object de type Test3


Merci d'avance pour toutes vos remarques, ...

Bernard












Avatar
Jacques-Olivier Haenni
Bonjour,

Bernard Koninckx wrote:
Je comprens pas tout à fait ce que tu veux dire. Pourrait tu me donner un
exemple ?


Voici un exemple de code. En fait, pour la inner class non statique, il
n'est pas possible d'utiliser clazz.newInstance() car il n'y a en fait
pas de constructeur sans argument, bien que cela soit caché tant que l'on
ne fait pas de réflexion...

import java.lang.reflect.Constructor;

public class Test {
public static void main(String args[]) throws Exception {
Class clazz = Outer.StaticInner.class;
Object o = clazz.newInstance();

clazz = Outer.NonStaticInner.class;
Constructor constructor
= clazz.getConstructor(new Class[] { Outer.class });
o = constructor.newInstance(new Object[] { new Outer() });
}
}

class Outer {
public static class StaticInner {
public StaticInner() {
System.out.println("No-arg constructor called in static"
+ " inner class.");
}
}
public class NonStaticInner {
public NonStaticInner() {
System.out.println("No-arg constructor called in non"
+ " static inner class.");
}
}
}

Jacques-Olivier


Bernard

"Jacques-Olivier Haenni" a écrit dans le
message de news: c74p2q$q0$

Bonjour,

Si Test3 est une inner class non statique de Test2, alors, lors de la
création par réflexion, il faut rajouter un argument de type Test2. Par
exemple, si Test3 a un constructeur sans argument, il faudra, par
réflexion, appeler un constructeur avec un argument de type Test2.

Cet argument supplémentaire est automatiquement rajouté par le
compilateur (sauf dans le cas de la réflexion évidemment) pour que
l'instance de l'inner classe ait une référence sur la classe englobante.

Jacques-Olivier


Bernard Koninckx wrote:

J'essaye en vain

Class c = Class.forName(dataObjectClass.getName());
Object o = c.newInstance();

Mais ça ne fonctionne pas ...

"Bernard Koninckx" a écrit dans le message



de

news: 408a2eea$0$10949$


Bonjour à tous,

Est-il possible de créer dynamiquement une instance d'inner class à


partir


d'une autre que celle qui englobe l'inner class.

Ex. :
Je souhaite instancier Test3 à partir d'une classe TableModelObject.
Voici la structure :

Test
Test2
Test3 extends Test2

TableModelObject
=> essaye d'instancier un object de type Test3


Merci d'avance pour toutes vos remarques, ...

Bernard