创建一个No-op InvocationHandler

时间:2016-03-18 16:26:58

标签: java reflection proxy nullpointerexception invocationhandler

我试图创建一个无操作的听众"使用Java的InvocationHandlerProxy类。我不确定下面的实现是否会处理每个场景,也不确定它是否是最佳解决方案。我真正喜欢的是这个课程没有任何影响。有没有比下面更好的表达这个概念的方法?

public class EmptyListener {
  public static <T> T createEmptyListenerFor(Class<T> aInterface) throws Exception {
    return (T) Proxy.newProxyInstance(aInterface.getClassLoader(), new Class[] { aInterface }, new EmptyInvocationHandler());
  }

  private static class EmptyInvocationHandler implements InvocationHandler {
    public EmptyInvocationHandler() {}
    @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      Class<?> returnType = method.getReturnType();
      if (returnType.isPrimitive()) {
        if (returnType.equals(boolean.class)) {
          return false;
        } else if (returnType.equals(void.class)) {
          return null;
        } else if ( returnType.equals(byte.class)) {
          return (byte)0;
        } else if ( returnType.equals(short.class)) {
          return (short)0;
        } else if ( returnType.equals(int.class)) {
          return 0;
        } else if ( returnType.equals(long.class)) {
          return 0l;
        } else if ( returnType.equals(float.class)) {
          return 0f;
        } else if ( returnType.equals(double.class)) {
          return 0d;
        } else if ( returnType.equals(char.class)) {
          return '\u0000';
        }
      }
      return null;        
  }
}

也许我在这里咆哮错误的树。同样,这是在初始化时为侦听器接口创建代理,占位符或Null objects的简单方法。这里的想法是可以注入此侦听器并防止意外调用null引用。有没有更好的方法来完成我在这里尝试做的事情?或者有人在一个我不了解的开源项目中写了类似的东西?我知道Guava的Optional,但那不是我想要的。

1 个答案:

答案 0 :(得分:0)

根据上下文,这可能会有很高的成本,因为JVM可能无法实现这一点。如果您在Java服务器上执行此操作,内联将很重要,并且permgen大小不会,但如果您在Android上执行此操作,内联可能无关紧要,但permgen大小(或者更确切地说是所有冗余方法)所有这些无用的空实现的结果都很重要。

如果这是在Java服务器上,您可以编写一个注释处理器,它可以自动生成您可能需要的所有空实现。

但是,我只是在任何地方使用@Nonnull注释,并在使用前强制null检查。