Question toute bête! Comment savoir dans quelle méthode se trouve le
code qui est exécuté.
J'arrive à récupérer la classe courante: this.toString() mais je ne
trouve pas le moyen de connaître la méthode courante.
Merci beaucoup pour vos éclaircissements sur la question de la méthode courante.
Par contre pour ma deuxième question je bloque toujours sur le passage de paramètres au constructeur.
Je ne trouve que: Class.forName("maClasse").newInstance()
Alors que je voudrais passer des paramètres lors de l'appel de newInstance...
La solution de Laurent Bossavit (la notion d'interface SchedulableFactory auquelle toutes les classes se conformeraient) est le seul compromis valable mais je trouve ca insuffisant.
Il y a aussi la solution d'avoir une méthode qui recevra mes paramètres mais c toujours un peu "bidouille".
Pourquoi donc les concepteurs n'ont pas permis le passage de paramètres au constructeur d'une classe récupérée par l'appel Class.forName?
J'ai bien essayé de trouver le constructeur via la méthode find suivante, mais il me retourne que les méthodes et pas de référence vers le constructeur (ca me pendait au nez mais qui ne tente rien n'a rien...):
for (int i=0; i<methods.length; i++) { System.out.println(methods[i].getName()); if (methods[i].getName().equals(nameStr)) return methods[i]; }
return null; }
Voilà, si vous avez d'autres idées... je suis preneur!
Merci beaucoup pour vos éclaircissements sur la question de la méthode
courante.
Par contre pour ma deuxième question je bloque toujours sur le passage
de paramètres au constructeur.
Je ne trouve que:
Class.forName("maClasse").newInstance()
Alors que je voudrais passer des paramètres lors de l'appel de
newInstance...
La solution de Laurent Bossavit (la notion d'interface
SchedulableFactory auquelle toutes les classes se conformeraient) est le
seul compromis valable mais je trouve ca insuffisant.
Il y a aussi la solution d'avoir une méthode qui recevra mes paramètres
mais c toujours un peu "bidouille".
Pourquoi donc les concepteurs n'ont pas permis le passage de paramètres
au constructeur d'une classe récupérée par l'appel Class.forName?
J'ai bien essayé de trouver le constructeur via la méthode find
suivante, mais il me retourne que les méthodes et pas de référence vers
le constructeur (ca me pendait au nez mais qui ne tente rien n'a rien...):
Merci beaucoup pour vos éclaircissements sur la question de la méthode courante.
Par contre pour ma deuxième question je bloque toujours sur le passage de paramètres au constructeur.
Je ne trouve que: Class.forName("maClasse").newInstance()
Alors que je voudrais passer des paramètres lors de l'appel de newInstance...
La solution de Laurent Bossavit (la notion d'interface SchedulableFactory auquelle toutes les classes se conformeraient) est le seul compromis valable mais je trouve ca insuffisant.
Il y a aussi la solution d'avoir une méthode qui recevra mes paramètres mais c toujours un peu "bidouille".
Pourquoi donc les concepteurs n'ont pas permis le passage de paramètres au constructeur d'une classe récupérée par l'appel Class.forName?
J'ai bien essayé de trouver le constructeur via la méthode find suivante, mais il me retourne que les méthodes et pas de référence vers le constructeur (ca me pendait au nez mais qui ne tente rien n'a rien...):
for (int i=0; i<methods.length; i++) { System.out.println(methods[i].getName()); if (methods[i].getName().equals(nameStr)) return methods[i]; }
return null; }
Voilà, si vous avez d'autres idées... je suis preneur!
cilovie
Regarde du côté de constructor : http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Constructor.html
"hervé dubuis" a écrit dans le message de news:400471aa$0$24030$
Merci beaucoup pour vos éclaircissements sur la question de la méthode courante.
Par contre pour ma deuxième question je bloque toujours sur le passage de paramètres au constructeur.
Je ne trouve que: Class.forName("maClasse").newInstance()
Alors que je voudrais passer des paramètres lors de l'appel de newInstance...
La solution de Laurent Bossavit (la notion d'interface SchedulableFactory auquelle toutes les classes se conformeraient) est le seul compromis valable mais je trouve ca insuffisant.
Il y a aussi la solution d'avoir une méthode qui recevra mes paramètres mais c toujours un peu "bidouille".
Pourquoi donc les concepteurs n'ont pas permis le passage de paramètres au constructeur d'une classe récupérée par l'appel Class.forName?
J'ai bien essayé de trouver le constructeur via la méthode find suivante, mais il me retourne que les méthodes et pas de référence vers le constructeur (ca me pendait au nez mais qui ne tente rien n'a rien...):
for (int i=0; i<methods.length; i++) { System.out.println(methods[i].getName()); if (methods[i].getName().equals(nameStr)) return methods[i]; }
return null; }
Voilà, si vous avez d'autres idées... je suis preneur!
Regarde du côté de constructor :
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Constructor.html
"hervé dubuis" <anonymous@nospam.fr> a écrit dans le message de
news:400471aa$0$24030$626a54ce@news.free.fr...
Merci beaucoup pour vos éclaircissements sur la question de la méthode
courante.
Par contre pour ma deuxième question je bloque toujours sur le passage
de paramètres au constructeur.
Je ne trouve que:
Class.forName("maClasse").newInstance()
Alors que je voudrais passer des paramètres lors de l'appel de
newInstance...
La solution de Laurent Bossavit (la notion d'interface
SchedulableFactory auquelle toutes les classes se conformeraient) est le
seul compromis valable mais je trouve ca insuffisant.
Il y a aussi la solution d'avoir une méthode qui recevra mes paramètres
mais c toujours un peu "bidouille".
Pourquoi donc les concepteurs n'ont pas permis le passage de paramètres
au constructeur d'une classe récupérée par l'appel Class.forName?
J'ai bien essayé de trouver le constructeur via la méthode find
suivante, mais il me retourne que les méthodes et pas de référence vers
le constructeur (ca me pendait au nez mais qui ne tente rien n'a rien...):
Regarde du côté de constructor : http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Constructor.html
"hervé dubuis" a écrit dans le message de news:400471aa$0$24030$
Merci beaucoup pour vos éclaircissements sur la question de la méthode courante.
Par contre pour ma deuxième question je bloque toujours sur le passage de paramètres au constructeur.
Je ne trouve que: Class.forName("maClasse").newInstance()
Alors que je voudrais passer des paramètres lors de l'appel de newInstance...
La solution de Laurent Bossavit (la notion d'interface SchedulableFactory auquelle toutes les classes se conformeraient) est le seul compromis valable mais je trouve ca insuffisant.
Il y a aussi la solution d'avoir une méthode qui recevra mes paramètres mais c toujours un peu "bidouille".
Pourquoi donc les concepteurs n'ont pas permis le passage de paramètres au constructeur d'une classe récupérée par l'appel Class.forName?
J'ai bien essayé de trouver le constructeur via la méthode find suivante, mais il me retourne que les méthodes et pas de référence vers le constructeur (ca me pendait au nez mais qui ne tente rien n'a rien...):
for (int i=0; i<methods.length; i++) { System.out.println(methods[i].getName()); if (methods[i].getName().equals(nameStr)) return methods[i]; }
return null; }
Voilà, si vous avez d'autres idées... je suis preneur!
dominique.dechamps
Voilà, si vous avez d'autres idées... je suis preneur! je te propose d'aller visiter
http://dominique.dechamps.free.fr/JA/html/home.html dans le package JA.ActionnerManager il y a une classe ConstructorFactory qui fera peut-être ton affaire
Voilà, si vous avez d'autres idées... je suis preneur!
je te propose d'aller visiter
http://dominique.dechamps.free.fr/JA/html/home.html
dans le package JA.ActionnerManager il y a une classe
ConstructorFactory qui fera peut-être ton affaire
Voilà, si vous avez d'autres idées... je suis preneur! je te propose d'aller visiter
http://dominique.dechamps.free.fr/JA/html/home.html dans le package JA.ActionnerManager il y a une classe ConstructorFactory qui fera peut-être ton affaire
Nicolas Delsaux
Le 13.01 2004, Martin Lafaix s'est levé et s'est dit : "tiens, si j'écrivais aux mecs de fr.comp.lang.java ?"
Sauf que cet argument de la lenteur des méthodes synchronized commence fichtrement à dater, et qu'en plus il n'était vrai qu'avec certaines JVM (celles de SUN, certes, mais pas celles d'IBM pour n'en citer qu'une).
Tu as des benchs qui démontrent ça ?
Ce qui fait qu'on se retrouve avec des librairies inutilisable en contexte réel puisqu'elles donnent des résultats aléatoires dans des applications multithread. (On peut certes arguer que c'est un problème de librairie mal écrite, mais le problème est là.)
J'ai rien compris, là. Si tu utilises une List synchronisée (grâce à la méthode de Collections), ça marche dans un contexte multithread, non ? Et tu t'abstrait de l'implémentation choisie, non ? Bon alors, qu'est-ce qui te chagrine ?
-- Nicolas Delsaux "C'est l'équation qui m'a trouvé" Paul Dirac
Le 13.01 2004, Martin Lafaix s'est levé et s'est dit : "tiens, si
j'écrivais aux mecs de fr.comp.lang.java ?"
Sauf que cet argument de la lenteur des méthodes synchronized commence
fichtrement à dater, et qu'en plus il n'était vrai qu'avec certaines JVM
(celles de SUN, certes, mais pas celles d'IBM pour n'en citer qu'une).
Tu as des benchs qui démontrent ça ?
Ce qui fait qu'on se retrouve avec des librairies inutilisable en
contexte réel puisqu'elles donnent des résultats aléatoires dans des
applications multithread. (On peut certes arguer que c'est un problème
de librairie mal écrite, mais le problème est là.)
J'ai rien compris, là. Si tu utilises une List synchronisée (grâce à la
méthode de Collections), ça marche dans un contexte multithread, non ? Et
tu t'abstrait de l'implémentation choisie, non ? Bon alors, qu'est-ce qui
te chagrine ?
--
Nicolas Delsaux
"C'est l'équation qui m'a trouvé"
Paul Dirac
Le 13.01 2004, Martin Lafaix s'est levé et s'est dit : "tiens, si j'écrivais aux mecs de fr.comp.lang.java ?"
Sauf que cet argument de la lenteur des méthodes synchronized commence fichtrement à dater, et qu'en plus il n'était vrai qu'avec certaines JVM (celles de SUN, certes, mais pas celles d'IBM pour n'en citer qu'une).
Tu as des benchs qui démontrent ça ?
Ce qui fait qu'on se retrouve avec des librairies inutilisable en contexte réel puisqu'elles donnent des résultats aléatoires dans des applications multithread. (On peut certes arguer que c'est un problème de librairie mal écrite, mais le problème est là.)
J'ai rien compris, là. Si tu utilises une List synchronisée (grâce à la méthode de Collections), ça marche dans un contexte multithread, non ? Et tu t'abstrait de l'implémentation choisie, non ? Bon alors, qu'est-ce qui te chagrine ?
-- Nicolas Delsaux "C'est l'équation qui m'a trouvé" Paul Dirac
vclassine
hervé dubuis wrote in message news:<4003e706$0$24043$...
En passant...
private String getCurrentMethod() { Exception e = new Exception(); methodStr = e.getStackTrace()[1].toString(); methodStr = methodStr.substring(0,methodStr.indexOf('(')); return methodStr; }
Je ne crois pas que ca marche car si j'instancie l'exception dans la méthode getCurrentMethod, ce sera ce nom là qu'il va me donner et pas celui de la méthode appelante. Sauf que dans mon code je lis la ligne suivante
(e.getStackTrace()[0+1]), donc la méthode appelant getCurrentMethod().
"Je ne sais pas ce que tu veux faire mais ça à l'air louche..." --> C tout simple, je voudrais programmer des classes qui s'exécuteraient à des intervalles de temps régulier.
Et je voudrais que le Scheduler (le plannificateur des tâches) ait une seule méthode d'ajout de classes (avec passage de paramètres!!!) et pas une méthode pour chaque type de classe à ajouter.
Tu peux reprendre l'idée de Laurent en y ajoutant un argument Object[] args à la méthode createInstance(). Comme ça c'est à la méthode createInstance de se débrouiller avec le tableau d'objet pour appeler le constructeur approprié.
Exemple (à la va vite, désolé si ça merde):
public class UneClasseTache implements Schedulable { private UneClasseTache(int i, String s, long[] l_tab) {...}
public Schedulable createInstance(Object[] args) { int arg0; String arg1; long[] arg2;
//là ça mériterait un traitement un peu plus fin... try { arg0 = ((Integer)args[0]).intValue(); arg1 = (String)args[1]; arg2 = (long[])args[2]; } catch(ClassCastException cc_exc) { throw new IllegalArgumentException(cc_exc); } catch(ClassCastException cc_exc) { throw new IllegalArgumentException(cc_exc); }
return new UneClasseTache(arg0,arg1,arg2);
}
public int getFrequency() { return myFrequency; }
}
hervé dubuis <anonymous@nospam.fr> wrote in message news:<4003e706$0$24043$626a54ce@news.free.fr>...
En passant...
private String getCurrentMethod()
{
Exception e = new Exception();
methodStr = e.getStackTrace()[1].toString();
methodStr = methodStr.substring(0,methodStr.indexOf('('));
return methodStr;
}
Je ne crois pas que ca marche car si j'instancie l'exception dans la
méthode getCurrentMethod, ce sera ce nom là qu'il va me donner et pas
celui de la méthode appelante.
Sauf que dans mon code je lis la ligne suivante
(e.getStackTrace()[0+1]), donc la méthode appelant getCurrentMethod().
"Je ne sais pas ce que tu veux faire mais ça à l'air louche..."
--> C tout simple, je voudrais programmer des classes qui
s'exécuteraient à des intervalles de temps régulier.
Et je voudrais que le Scheduler (le plannificateur des tâches) ait une
seule méthode d'ajout de classes (avec passage de paramètres!!!) et pas
une méthode pour chaque type de classe à ajouter.
Tu peux reprendre l'idée de Laurent en y ajoutant un argument Object[]
args à la méthode createInstance(). Comme ça c'est à la méthode
createInstance de se débrouiller avec le tableau d'objet pour appeler
le constructeur approprié.
Exemple (à la va vite, désolé si ça merde):
public class UneClasseTache implements Schedulable
{
private UneClasseTache(int i, String s, long[] l_tab)
{...}
public Schedulable createInstance(Object[] args)
{
int arg0;
String arg1;
long[] arg2;
//là ça mériterait un traitement un peu plus fin...
try
{
arg0 = ((Integer)args[0]).intValue();
arg1 = (String)args[1];
arg2 = (long[])args[2];
}
catch(ClassCastException cc_exc)
{
throw new IllegalArgumentException(cc_exc);
}
catch(ClassCastException cc_exc)
{
throw new IllegalArgumentException(cc_exc);
}
hervé dubuis wrote in message news:<4003e706$0$24043$...
En passant...
private String getCurrentMethod() { Exception e = new Exception(); methodStr = e.getStackTrace()[1].toString(); methodStr = methodStr.substring(0,methodStr.indexOf('(')); return methodStr; }
Je ne crois pas que ca marche car si j'instancie l'exception dans la méthode getCurrentMethod, ce sera ce nom là qu'il va me donner et pas celui de la méthode appelante. Sauf que dans mon code je lis la ligne suivante
(e.getStackTrace()[0+1]), donc la méthode appelant getCurrentMethod().
"Je ne sais pas ce que tu veux faire mais ça à l'air louche..." --> C tout simple, je voudrais programmer des classes qui s'exécuteraient à des intervalles de temps régulier.
Et je voudrais que le Scheduler (le plannificateur des tâches) ait une seule méthode d'ajout de classes (avec passage de paramètres!!!) et pas une méthode pour chaque type de classe à ajouter.
Tu peux reprendre l'idée de Laurent en y ajoutant un argument Object[] args à la méthode createInstance(). Comme ça c'est à la méthode createInstance de se débrouiller avec le tableau d'objet pour appeler le constructeur approprié.
Exemple (à la va vite, désolé si ça merde):
public class UneClasseTache implements Schedulable { private UneClasseTache(int i, String s, long[] l_tab) {...}
public Schedulable createInstance(Object[] args) { int arg0; String arg1; long[] arg2;
//là ça mériterait un traitement un peu plus fin... try { arg0 = ((Integer)args[0]).intValue(); arg1 = (String)args[1]; arg2 = (long[])args[2]; } catch(ClassCastException cc_exc) { throw new IllegalArgumentException(cc_exc); } catch(ClassCastException cc_exc) { throw new IllegalArgumentException(cc_exc); }
return new UneClasseTache(arg0,arg1,arg2);
}
public int getFrequency() { return myFrequency; }
}
Sylvain
Ya moyen de faire : Action act = (Action) Class.forName("TaClasse").newInstance(); act.validate(mesParam);
Ya moyen de faire :
Action act = (Action) Class.forName("TaClasse").newInstance();
act.validate(mesParam);