2016-09-07 2 views
5

Gibt es eine Möglichkeit, dass eine Methode in einer Klasse jedes Mal ausgeführt werden kann, wenn eine Methode dieser Klasse aufgerufen wird.Aufruf einer Methode vor jedem Methodenaufruf dieser Klasse in Java

Ich werde kurz von meinem Szenario hier geben:

Class Util{ 

    private isConnected(){ 
     if(!xxxapi.connected()) 
      throw new MyException(....) 
} 
    public createFile(){....} 
    public removeFile(){....} 
} 

Also, immer wenn ich new Util.createFile() Ich möchte rufen, dass isConnected() aufgerufen wird, bevor createFile() tatsächlich beginnt. Offensichtlich Ich kann isConnected() jedes Mal beim Start jeder Methode aufrufen, aber ich fragte mich, ob ich eine andere Lösung haben kann.

Gibt es einen anderen Vorschlag/eine Lösung für ein solches Szenario?

+0

Sie sollten wahrscheinlich Reflexion apis erkunden. Mit Reflektion können Sie dies erreichen. Wenn Sie in Ordnung sind, Framework zu verwenden, können Sie wahrscheinlich in Spring AOP suchen, das für Ihren Anwendungsfall da ist. – sakura

+0

Sie könnten AOP verwenden, aber wenn Sie diese Methode beim Start _every_ Methode aufrufen möchten, werden Sie wahrscheinlich nicht viel davon (in Bezug auf die Entwicklerleistung) bekommen. – Thomas

+0

Ich denke, Sie sollten in Annotationen für eine elegantere Lösung suchen – BigMike

Antwort

9

sollten Sie schreiben ein InvocationHandler (http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/InvocationHandler.html), die Anrufe an Ihre Objekte abfangen würde, und dann reflexiv (Reflexion API) aufrufen zuerst die isConnected() Verfahren nach dem Verfahren gefolgt, zu dem der Anruf gemacht wurde.

Probe: Util Schnittstelle:

public interface Util { 

    void isConnected(); 

    void createFile(); 

    void removeFile(); 

} 

Util Aufruf Handler:

public class UtilInvocationHandler implements InvocationHandler { 

    private Util util = new UtilImpl(); 

    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) 
      throws Throwable { 

     // look up isConnectedMethod 
     Method isConnectedMethod = util.getClass().getMethod("isConnected"); 

     // invoke the method 
     isConnectedMethod.invoke(util); 

     // process result of the above call here 

     // invoke the method to which the call was made 
     Object returnObj = method.invoke(util, args); 

     return returnObj; 
    } 

    private static class UtilImpl implements Util { 
     public void isConnected(){ 
      System.out.println("isConnected()"); 
     } 

     public void createFile(){ 
      System.out.println("createFile()"); 
     } 

     public void removeFile(){ 
      System.out.println("removeFile()"); 
     } 
    } 
} 

Objekt Initialisierung:

Util util = (Util) Proxy.newProxyInstance(
            Util.class.getClassLoader(), 
            new Class[] {Util.class}, 
            new UtilInvocationHandler()); 
Verwandte Themen