Appeler une methode sans l'appler :|

Appeler une methode sans l'appler :| - Java - Programmation

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.

Reply

Marsh Posté le 06-04-2005 à 17:43:01   

Reply

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+


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

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();


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

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;)


Message édité par sebi le 06-04-2005 à 19:24:53
Reply

Marsh Posté le 07-04-2005 à 08:47:27    

Merci a vous

Reply

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);

Reply

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 :)

Reply

Marsh Posté le 07-04-2005 à 14:57:55    

merci de l'info, ca fait moins chargé

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed