2011-08-18 85 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提供的功能的一个更有限的子集,但它也更容易使用并添加到您的项目中!