es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

llame al método varias veces con Thread.currentThread().getStackTrace()

Tengo varios métodos para otra clase que debo llamar times veces. (times siempre es >0)
Quiero hacer esto en otro método llamado doit, dándole times y luego mira desde dónde se llamó y llama, por ejemplo, super.move la cantidad de veces.

@Override
public void move(int times) {
  doit(times);
}

@Override
public void turnLeft(int times) {
  doit(times);
}
@Override
[...]

public void doit (int t){
  for (int r=-t; r>0; r--)
   super.getDeclaredMethod(Thread.currentThread().getStackTrace()[2].getMethodName(), RepetitiveRobotImpl);// ?????
}

getDeclaredMethod()” https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html

Thread.currentThread().getStackTrace()[2].getMethodName()” https://stackoverflow.com/questions/421280/how-do-i-find-the-caller-of-a-method-using-stacktrace-or-reflection/421338#421338

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para llamar a múltiples métodos de otra clase, dada la variable times y llamarlos desde otro método llamado doit, se puede utilizar el método getDeclaredMethod y el método getStackTrace en Java. Aquí está un ejemplo de implementación:

    @Override
    public void move(int times) {
      doit(times);
    }
    
    @Override
    public void turnLeft(int times) {
      doit(times);
    }
    // añade otros métodos aquí si es necesario
    
    public void doit(int times) {
      StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
      String callerMethodName = stacktrace[2].getMethodName();
      // El segundo elemento en la pila de llamadas debe ser el llamador del método doit
      try {
        Method methodToCall = super.getClass().getDeclaredMethod(callerMethodName, RepetitiveRobotImpl.class);
        for (int i = 0; i < times; i++) {
          methodToCall.invoke(super, this);
        }
      } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
        e.printStackTrace();
      }
    }
    

    En el método doit, primero obtenemos el nombre del método llamador utilizando el método getStackTrace. Luego, usamos getDeclaredMethod para obtener el objeto de método del método llamador. Finalmente, usamos el método invoke para llamar al método times veces, pasando la instancia del objeto actual (this) como argumento.

    Ten en cuenta que esta implementación asume que todos los métodos que queremos llamar toman un argumento de tipo RepetitiveRobotImpl. Si este no es el caso, deberás modificar la llamada getDeclaredMethod y la implementación del bucle en consecuencia.

Comments are closed.