我正在尝试使用 JavaInvocationHandler
和Proxy
类创建一个无操作“侦听器”。我不确定下面的实现是否能处理所有场景,也不确定它是否是最佳解决方案。我真正想要的是这个类没有效果。有没有比下面更好的方式来表达这个概念?
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 对象的简单方法。这里的想法是可以注入此侦听器并防止意外调用null
引用。有没有更好的方法来完成我在这里尝试做的事情?或者有人在我不知道的开源项目中写了类似的东西?我知道番石榴Optional
,但这并不是我真正想要的。