2011-08-18 75 views
1

我可以爲方法指定一個方法嗎?當它的參數爲空時,什麼都不做,因爲沒有被調用?編寫註釋以防止參數無效時調用方法

+0

你使用任何一種框架?春天? java驗證框架? – Kal

+1

你可以,但你會如何需要在你的方法周圍使用代理來查看這些參數是否爲空。 –

+0

@Kal不,我沒有使用任何框架,我想這樣做,因爲我想讓方法失敗,而不是在運行時拋出NPE,太多的防禦檢查null只是混亂我的代碼,在我的項目中我們得到來自集合的大量輸入,一切都可以爲空,所以我想試試它是否有效。 – Sawyer

回答

3

可能最簡單的方法是使用接口和動態代理。註釋除了添加元數據外什麼也不做。您將不得不添加代碼以基於註釋行事。

你必須做一些事情 -

創建界面

public interface IService { 

    @ValidateNull // Your custom annotation 
    public void yourMethod(String s1); 
} 

使用時實施,實例化它作爲一個JDK代理。現在

IService myService = (IService)java.lang.Proxy.newInstance(ServiceImpl.class.getClassLoader(), 
          ServiceImpl.class.getInterfaces(), 
          new YourProxy(new ServiceImpl()); 

,您可以通過反射,捕捉方法的所有調用的YourProxy類。

public YourProxy implements InvocationHandler { 
public Object invoke(Object arg0, Method method, Object[] args) throws Throwable { 
    if (method.isAnnotationPresent(ValidateNull.class)) { 
        //Check args if they are null and return. 
      } 
    } 
} 

如果你不想這樣做,那麼你正在尋找更重量級的框架,如AspectJ/Spring AOP。

+0

你不能*使用接口。任何非final方法都可以在運行時使用cglib等代碼,而編譯時編織基本上可以提供任何建議。基於接口的JDK代理無疑是最容易理解的,並且將最少的「黑魔法」應用於您的項目! – Affe

+0

@Affe - 好點。我會編輯我的帖子,以更準確地反映這一點。 – Kal

3

註解本身只是數據。他們不「做」任何事情。有許多不同的方法可以讓你有一個運行時框架來解釋註釋並完成你所需要的功能。最常見的技術將是所謂的面向方面編程,您可以根據元數據改變程序組件的行爲。

aspectJ是一個全功能的庫,允許你改變任何事情的行爲!你甚至不會在技術上需要一個註釋將完整的方面,有很多不同的方法來「匹配」你想改變行爲的方法。

SpringAOP是aspectJ提供的功能的一個更有限的子集,但它也更容易使用並添加到您的項目中!