2016-09-07 8 views
5

そのクラスのメソッドが呼び出されるたびに、クラス内でメソッドを実行できる方法はありますか?Javaでそのクラスを呼び出す前にメソッドを呼び出す

私はここに私のシナリオを簡単にあげる:

Class Util{ 

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

をので、私はcreateFile()が実際に開始する前にをisConnected()が呼び出されたことをしたいnew Util.createFile()を呼び出すいつでも。 明らかに私はそれぞれの方法の開始時に毎回isConnected()を呼び出すことができますが、別の解決方法があるのだろうかと思っていました。

このようなシナリオには、他に提案や解決策がありますか?

+0

おそらく、リフレクションAPIを探る必要があります。反射を使ってこれを達成することができます。フレームワークを使用しても構わないのであれば、おそらく、あなたのユースケースのためにそこにあるSpring AOPを調べることができます。 – sakura

+0

あなたはAOPを使うことができますが、そのメソッドをstart _every_メソッドで呼び出す場合を除き、おそらく開発者のパフォーマンスの点でそれほど多くは得られません。 – Thomas

+0

あなたはより洗練されたソリューションの注釈を調べるべきだと思います。 – BigMike

答えて

9

あなたが書くべき最初の呼び出しが行われたに方法が続くisConnected()メソッドを呼び出します(リフレクションAPIを使用して)反射的、あなたのオブジェクトへの呼び出しをインターセプトし、うInvocationHandlerhttp://docs.oracle.com/javase/7/docs/api/java/lang/reflect/InvocationHandler.html)。

サンプル: Utilのインターフェース:

public interface Util { 

    void isConnected(); 

    void createFile(); 

    void removeFile(); 

} 

Utilの呼び出しハンドラ:

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

オブジェクトの初期化:

Util util = (Util) Proxy.newProxyInstance(
            Util.class.getClassLoader(), 
            new Class[] {Util.class}, 
            new UtilInvocationHandler()); 
関連する問題