OVH Cloud OVH Cloud

Question simple: méthode courante.

16 réponses
Avatar
hervé dubuis
Bonsoir,

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 d'avance.
Hervé.

6 réponses

1 2
Avatar
hervé dubuis
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...):

private static Method find(String nameStr) throws Exception
{
Class clazz = Class.forName(nameStr);

if(clazz == null)
System.out.println("null");
else
System.out.println("Not null");


Method[] methods = clazz.getMethods();

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!
Avatar
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...):

private static Method find(String nameStr) throws Exception
{
Class clazz = Class.forName(nameStr);

if(clazz == null)
System.out.println("null");
else
System.out.println("Not null");


Method[] methods = clazz.getMethods();

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!





Avatar
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

Avatar
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

Avatar
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;
}


}


Avatar
Sylvain
Ya moyen de faire :
Action act = (Action) Class.forName("TaClasse").newInstance();
act.validate(mesParam);
1 2