Appeler une methode sans l'appler :| - Java - Programmation
Marsh Posté le 06-04-2005 à 17:51:10
va voir du côté du paquetage java.lang.reflect
à mon avis, si c pas làdedans que tu auras ta réponse, c kil ny en pas
a+
Marsh Posté le 06-04-2005 à 18:50:15
interfaces, méthodes abstraites, ça te dit qqchose?
ensuite, pour le timing et autres trucs qui se passent autour des methodes, peut etre que l'aop peut t'aider, aussi.
et sinon, executerLaMethode(methodeName); en gros c'est
Machin.class.getMethod(methodName).execute();
Marsh Posté le 06-04-2005 à 19:24:12
je confirme AOP peut faire l'affaire , regarde le concept "Around advice", et puis c'est l'occasion d'utiliser Spring sans se tapper de l'AspectJ
Marsh Posté le 07-04-2005 à 13:26:13
Voila ce a quoi je suis finalement arrivé. Beaucoup plus pritique.
private Map invokeMethod(String[] methods,boolean isWithTime, boolean isCountEnabled, Map map)
{
Map<String, Object> mapResult = new HashMap<String, Object>();
try
{
// Method name
String methodName = Thread.currentThread().getStackTrace()[3].getMethodName();
mapResult.put(METHODE_NAME,methodName);
// Element count (BEFORE)
if(pm_bIsCountEnabled && pm_map != null)
{
mapResult.put(COUNT_BEFORE, map.size());
map.clear();
}
// Exceution Time (START)
long lTimeBefore = System.currentTimeMillis();
// Invoke methods
String status = STATUS_OK;
for(int i = 0; i < methods.length; i++)
{
Object InterResult = StaticDataService.class.getDeclaredMethod(methods[i],new Class[]{}).invoke(this,new Object[]{});
if(InterResult != null)
{
if(InterResult instanceof Map)
{
Map mMap = (Map)InterResult;
if(mMap.get(STATUS).equals(STATUS_KO))
{
status = STATUS_KO;
}
}
mapResult.put(methods[i], InterResult);
}
}
// Exceution Time (STOP)
if(isWithTime)
{
mapResult.put(USED_TIME, doFormatUsedTime(lTimeBefore, System.currentTimeMillis()));
}
// Element count (AFTER)
if(pm_bIsCountEnabled && map != null)
{
mapResult.put(COUNT_AFTER, map.size());
}
// Status
mapResult.put(STATUS, status);
}
catch(Exception ex)
{
m_logger.error("*** StaticDataService : addInformation() : Exception", ex);
mapResult.clear();
// Method name
String methodName = Thread.currentThread().getStackTrace()[3].getMethodName();
mapResult.put(METHODE_NAME, methodName);
mapResult.put(STATUS, STATUS_KO);
}
return mapResult;
}
A l'appel de methode ca donne :
String[] methodsInvok = new String[]
{
"executeRemoteLoadRVLStocks",
"executeRemoteLoadRVLWarrants",
"executeRemoteLoadAllIndexesComposition",
"executeRemoteLoadAllIndexes",
"executeRemoteLoadMembers",
"executeRemoteLoadSpecialists"
};
return invokeMethod(methodsInvok, true, false, null);
String[] methodsInvok = new String[]{
"executeLoadRVLStocks"
};
return invokeMethod(methodsInvok, true, true, m_mapRVLByIsinDataStocks);
Marsh Posté le 07-04-2005 à 13:32:18
pour info, tu peux mettre null à la place de new Object[]{} et new Class[]{}
et pour peux que tu sois en 1.5, tu peux carrément ne rien mettre
Marsh Posté le 06-04-2005 à 17:43:01
Je sais que ca a l'aire compliqué mais avec un ti exemple, vous aller vite comprendre.
J'ai des méthodes qui quand elles sont appeler realise des operations similaires entre elle.
Je voudrais donc ne les ecrirent qu'une fois.
Mon probleme c'est que je ne sais pas les mettre dans une sous methode. en effet,
j'ai besoin du temps d'execution, du nombre d'element present dans une hashmap avant, apres execution.
Exemple :
public Map executeRemoteLoadSpecialists()
{
Map<String, Object> mapResult = new HashMap<String, Object>();
try
{
mapResult.put(METHODE_NAME, "executeRemoteLoadSpecialists" );
long lTimeBefore = System.currentTimeMillis();
executeLoadSpecialists();
long lTimeAfter = System.currentTimeMillis();
mapResult.put(USED_TIME, doFormatUsedTime(lTimeBefore, lTimeAfter));
mapResult.put(STATUS, STATUS_OK);
}
catch(Exception ex)
{
m_logger.error("*** StaticDataService : executeRemoteLoadSpecialists() : Exception", ex);
mapResult.clear();
mapResult.put(STATUS, STATUS_KO);
}
return mapResult;
}
public Map executeRemoteLoadAllIndexes()
{
Map<String, Object> mapResult = new HashMap<String, Object>();
try
{
mapResult.put(METHODE_NAME, "executeRemoteLoadAllIndexes" );
long lTimeBefore = System.currentTimeMillis();
mapResult.put(COUNT_BEFORE, "" + m_mapIDXByIsinData.size());
m_mapIDXByIsinData.clear();
executeLoadAllIndexes();
mapResult.put(COUNT_AFTER, "" + m_mapIDXByIsinData.size());
long lTimeAfter = System.currentTimeMillis();
mapResult.put(USED_TIME, doFormatUsedTime(lTimeBefore, lTimeAfter));
mapResult.put(STATUS, STATUS_OK);
}
catch(Exception ex)
{
m_logger.error("*** StaticDataService : executeRemoteLoadAllIndexes() : Exception", ex);
mapResult.clear();
mapResult.put(STATUS, STATUS_KO);
}
return mapResult;
}
Vous allez me dire que je peut la diviser en 2 sous fonctions (une avant, l'autre apres). Oui, mais d'abord, c'est pas aussi beau, mais en plus, c'est méthodes sont ajouter automatiquement (par introspection) dans mon client.ce préfererais un truc du genre
public Map executeRemoteLoadAllIndexes(String methodeName, Map map, boolean isWidthTime)
{
Map<String, Object> mapResult = new HashMap<String, Object>();
try
{
mapResult.put(METHODE_NAME, methodeName);
long lTimeBefore = System.currentTimeMillis();
(map!=null)mapResult.put(COUNT_BEFORE, "" + m_map.size());
m_map.clear();
executerLaMethode(methodeName);
(map!=null)mapResult.put(COUNT_AFTER, "" + m_map.size());
long lTimeAfter = System.currentTimeMillis();
if(isWidthTime)mapResult.put(USED_TIME, doFormatUsedTime(lTimeBefore, lTimeAfter));
mapResult.put(STATUS, STATUS_OK);
}
catch(Exception ex)
{
m_logger.error("*** StaticDataService : executeRemoteLoadAllIndexes() : Exception", ex);
mapResult.clear();
mapResult.put(STATUS, STATUS_KO);
}
return mapResult;
}
Voila ce que je voudrais faire. Est-ce possible, si oui est ce que vous pouvez me donner qlq pistes. Bien à vous, et merci d'avance.