2016-09-07 14 views
5

Có cách nào mà tôi có thể có một phương thức trong một lớp được thực thi mỗi khi bất kỳ phương thức nào của lớp đó được gọi.Gọi phương thức trước khi bất kỳ lời gọi phương thức nào của lớp đó trong Java

tôi sẽ cung cấp một tóm tắt kịch bản của tôi ở đây:

Class Util{ 

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

Vì vậy, bất cứ lúc nào tôi gọi new Util.createFile() Tôi muốn điều đó isConnected() được gọi trước khi createFile() thực sự bắt đầu. Rõ ràng là Tôi có thể gọi isConnected() mọi lúc khi bắt đầu từng phương pháp, nhưng tôi đã tự hỏi liệu tôi có thể có giải pháp khác hay không.

Có đề xuất/giải pháp nào khác cho tình huống như vậy không.

+0

Bạn có lẽ nên tìm hiểu apis phản ánh. Sử dụng sự phản chiếu bạn có thể đạt được điều này. Nếu bạn không được sử dụng framework, có lẽ bạn có thể xem xét Spring AOP trong trường hợp sử dụng của bạn. – sakura

+0

Bạn có thể sử dụng AOP nhưng trừ khi bạn muốn gọi phương thức đó ở phương thức _every_ bắt đầu, bạn có thể không nhận được nhiều điều đó (về hiệu suất của nhà phát triển). – Thomas

+0

Tôi nghĩ bạn nên nhìn vào chú thích cho một giải pháp thanh lịch hơn – BigMike

Trả lời

9

Bạn nên viết InvocationHandler (http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/InvocationHandler.html) sẽ chặn cuộc gọi đến đối tượng của bạn, sau đó phản ánh (sử dụng API phản chiếu) trước tiên gọi phương thức isConnected() theo sau phương thức đã thực hiện cuộc gọi.

mẫu: util Interface:

public interface Util { 

    void isConnected(); 

    void createFile(); 

    void removeFile(); 

} 

util gọi 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()"); 
     } 
    } 
} 

Object khởi:

Util util = (Util) Proxy.newProxyInstance(
            Util.class.getClassLoader(), 
            new Class[] {Util.class}, 
            new UtilInvocationHandler()); 
Các vấn đề liên quan