2016-09-07 12 views
5

Bu sınıfın herhangi bir yöntemi çağrıldığında her seferinde yürütülen bir yöntemde bir yönteme sahip olmanın bir yolu var mı.Java'da bu sınıfın herhangi bir yöntem çağrılmasından önce bir yöntem çağırın.

Benim burada senaryonun bir kısa vereceğiz:

Class Util{ 

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

Yani, new Util.createFile() çağrı zaman ben createFile() aslında başlamadan önce IsConnected() çağrılır bunu istiyorum. Açıkçası Her yöntemin başlangıcında her zaman isConnected()'u arayabilirim, ama başka bir çözüm bulabilir miyim diye merak ediyordum. Böyle bir senaryo için başka herhangi bir öneri/çözüm var mıdır?

+0

Muhtemelen yansıma apis incelemelisiniz. Yansıma kullanarak bunu başarabilirsiniz. Eğer çerçeve kullanacaksanız, muhtemelen kullanım durumunuz için orada olan AOP'ye bakabilirsiniz. – sakura

+0

AOP'yi kullanabilirsiniz, ancak bu yöntemi start _every_ yönteminde çağırmak istemiyorsanız, muhtemelen bundan daha fazla yararlanamayacaksınız (geliştirici performansı açısından). – Thomas

+0

Daha zarif bir çözüm için ek açıklamalara bakmanız gerektiğini düşünüyorum – BigMike

cevap

9

Sen yazmalısınız bir ilk çağrı yapıldığı için yöntem ile takip isConnected() yöntemi çağırmak (yansıma API kullanarak) yansıtıcı ardından nesnelere çağrıları yakalamak ve olur InvocationHandler (http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/InvocationHandler.html).

Örnek: Util Arayüzü:

public interface Util { 

    void isConnected(); 

    void createFile(); 

    void removeFile(); 

} 

Util çağırma işleyicisi:

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

Nesne başlatma:

Util util = (Util) Proxy.newProxyInstance(
            Util.class.getClassLoader(), 
            new Class[] {Util.class}, 
            new UtilInvocationHandler()); 
İlgili konular