Java 写入注释以防止在参数无效时调用方法

Java 写入注释以防止在参数无效时调用方法,java,annotations,Java,Annotations,我能为一个方法做一个注释吗?当它的参数为null时,什么也不做,就像不被调用一样有效?注释本身就是数据。他们什么都不“做”。有许多不同的方法可以让运行时框架解释注释并实现所需的功能。最常见的技术是所谓的面向方面编程,即根据元数据改变程序组件的行为 是一个功能齐全的库,允许您更改任何内容的行为!从技术上讲,您甚至不需要完整aspectJ的注释,有很多不同的方法来“匹配”您想要改变的方法的行为 是aspectJ提供的功能的一个更有限的子集,但它也因此更易于使用和添加到您的项目中 注释本身就是数据。他

我能为一个方法做一个注释吗?当它的参数为null时,什么也不做,就像不被调用一样有效?

注释本身就是数据。他们什么都不“做”。有许多不同的方法可以让运行时框架解释注释并实现所需的功能。最常见的技术是所谓的面向方面编程,即根据元数据改变程序组件的行为

是一个功能齐全的库,允许您更改任何内容的行为!从技术上讲,您甚至不需要完整aspectJ的注释,有很多不同的方法来“匹配”您想要改变的方法的行为


是aspectJ提供的功能的一个更有限的子集,但它也因此更易于使用和添加到您的项目中

注释本身就是数据。他们什么都不“做”。有许多不同的方法可以让运行时框架解释注释并实现所需的功能。最常见的技术是所谓的面向方面编程,即根据元数据改变程序组件的行为

是一个功能齐全的库,允许您更改任何内容的行为!从技术上讲,您甚至不需要完整aspectJ的注释,有很多不同的方法来“匹配”您想要改变的方法的行为


是aspectJ提供的功能的一个更有限的子集,但它也因此更易于使用和添加到您的项目中

最简单的方法可能是使用接口和动态代理。注释除了添加元数据之外什么也不做。您必须添加代码以根据注释进行操作

你得做几件事--

创建一个接口

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。

最简单的方法可能是使用接口和动态代理。注释除了添加元数据之外什么也不做。您必须添加代码以根据注释进行操作

你得做几件事--

创建一个接口

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。

您是否使用任何类型的框架?春天java验证框架?你可以,但你可能需要在方法周围使用代理来查看这些参数是否为null。@Kal不,我不使用任何框架,我想这样做,因为我希望方法是故障安全的,而不是在运行时抛出NPE,对null的太多防御检查只会使我的代码混乱,在我的项目中,我们从集合中获得了大量的输入,所有内容都可以为null,所以我想试试它是否有效。对于返回int的方法来说,“什么都不做”是什么意思?它没有被调用,实际上在我的例子中,它们只是不会返回任何内容的副作用。我认为抛出断言错误应该是可以的。您是否使用任何类型的框架?春天java验证框架?你可以,但你可能需要在方法周围使用代理来查看这些参数是否为null。@Kal不,我不使用任何框架,我想这样做,因为我希望方法是故障安全的,而不是在运行时抛出NPE,对null的太多防御检查只会使我的代码混乱,在我的项目中,我们从集合中获得了大量的输入,所有内容都可以为null,所以我想试试它是否有效。对于返回int的方法来说,“什么都不做”是什么意思?它没有被调用,实际上在我的例子中,它们只是不会返回任何内容的副作用。我认为抛出断言错误应该是可以的。您不必使用接口。任何非final方法都可以在运行时用cglib之类的东西进行代理,编译时编织基本上可以提供任何建议。基于接口的JDK代理当然是最容易摸索的,而且对您的项目应用的“黑魔法”最少@阿菲——说得好。我将编辑我的帖子以更准确地反映这一点。你不必使用界面。任何非final方法都可以在运行时用cglib之类的东西进行代理,编译时编织基本上可以提供任何建议。基于接口的JDK代理当然是最容易摸索的,而且对您的项目应用的“黑魔法”最少@阿菲——说得好。我将编辑我的帖子以更准确地反映这一点。