2012-08-03 38 views
3

Java OpenGL GL接口包含大約2000個方法,用於調試目的我想在執行某些日誌記錄時包裝實例並委託調用它。日誌代碼可以在每種情況下推送到相同的方法,因此寫出方法實現的任務看起來像是可以自動化的。什麼我試圖做一個例子:有條件地生成方法體以滿足Java中的大型接口

import javax.media.opengl.GL; 

public class GLErrorLogger implements GL { 
    private final GL backing; 

    public GLErrorLogger(GL delegateToMe) { 
    backing = delegateToMe; 
    } 

    private void checkErrorCode() { 
    // Log frame and thread details depending on gl state 
    } 

    /** 
    * Example of a method 
    */ 
    @Override 
    public int glGenLists(int arg0) { 
    checkErrorCode(); 
    int retVal = backing.glGenLists(arg0); 
    checkErrorCode(); 
    return retVal; 
    } 

    // rest of methods here... 
} 

換句話說複製的方法名稱和參數(減去它們的類型)爲支持對象在通話中,請用電話向測井方法,如果有是一個返回類型,然後將結果賦給這種類型的變量並在方法結束時返回。

我看着創建一個eclipse代碼模板來自動生成方法,但是沒有一個明顯的方式來對返回類型進行模式匹配。任何人都可以提出一種在Eclipse或其代碼生成工具中執行此操作的方法,以幫助我拔出正則表達式工具包?

+0

如何使用Aspecj4j並執行切割?請參閱http://stackoverflow.com/questions/8839077/how-to-use-aop-with-aspectj-for-logging – Rekin 2012-08-03 07:49:55

回答

5

您可能希望使用Aspect爲您創建必要的字節碼,而不是生成所有的源代碼。請看這裏的Traceing Aspect示例:Traceing Aspect Example

作爲替代方案,如果您不想將AspectJ用作Thrid party Library,則可以創建Java動態代理。請參考Dynamic Proxy Tutorial

+1

+1使用JDK代理 – 2012-08-03 07:55:11

+1

由於'代理'是JDK的一部分,非常簡單,我真的推薦此解決方案。到目前爲止,所有其他的提議都需要額外的庫,額外的開銷和額外的額外努力,爲初學者(該庫)提供很少的好處。 – 2012-08-03 08:08:12

+0

代理的好主意,它看起來像我仍然可以自反地獲取堆棧信息時調用通過調用處理程序的方法。 – MilesHampson 2012-08-03 08:09:19

2

按建議使用JDK代理,或者:使用模擬框架,如EasyMockMockito

GL mock = EasyMock.createMock(GL.class); 
EasyMock.expect(mock.someMethod()).andReturn(someValue); 
// or, if you need to do more computing: 
EasyMock.expect(mock.someOtherMethod()).andAnswer(new IAnswer<String>() { 
     public String answer() throws Throwable { 
      return "some value you calculate here"; 
     } 
    }); 
EasyMock.replay(mock); 

現在您可以使用mock對象來配置您配置的所有方法。 查看EasyMock readme瞭解更多信息。

+0

無論如何+1還是Mockito,這是讓東西跑的最快方式。謝謝。 – MilesHampson 2012-08-03 09:21:34