自动委派Java类的所有方法
假设我有一个包含许多公共方法的类:
public class MyClass { public void method1() {}
public void method2() {}
(...)
public void methodN() {}
}
现在,我想创建一个 包装器 类,该 包装器 类将所有方法委托给包装好的实例( 委托 ):
public class WrapperClass extends MyClass { private final MyClass delegate;
public WrapperClass(MyClass delegate) {
this.delagate = delegate;
}
public void method1() { delegate.method1(); }
public void method2() { delegate.method2(); }
(...)
public void methodN() { delegate.methodN(); }
}
现在,如果MyClass有很多方法,我将需要重写它们中的每一个,这些方法或多或少与只是“委托”的代码相同。我想知道是否可以做一些魔术来自动调用Java中的方法(因此Wrapper类需要说“嘿,如果您对我调用方法,只需去
委托 对象并对其调用此方法)。
顺便说一句:我不能使用继承,因为委托不在我的控制之下,我只是从其他地方获取它的实例(另一种情况是MyClass是final)。
注意:我不希望生成IDE。我知道我可以在IntelliJ / Eclipse的帮助下做到这一点,但我很好奇是否可以在代码中完成。
任何建议如何实现这样的目标?(注意:我可能可以使用php等脚本语言来做到这一点,而我可以使用php魔术函数来拦截该调用)。
回答:
也许动态Proxy
的Java可以帮助您。因此,仅当您使用接口时,它才起作用。在这种情况下,我将调用接口MyInterface
并设置默认实现:
public class MyClass implements MyInterface { @Override
public void method1() {
System.out.println("foo1");
}
@Override
public void method2() {
System.out.println("foo2");
}
@Override
public void methodN() {
System.out.println("fooN");
}
public static void main(String[] args) {
MyClass wrapped = new MyClass();
wrapped.method1();
wrapped.method2();
MyInterface wrapper = WrapperClass.wrap(wrapped);
wrapper.method1();
wrapper.method2();
}
}
包装类的实现如下所示:
public class WrapperClass extends MyClass implements MyInterface, InvocationHandler { private final MyClass delegate;
public WrapperClass(MyClass delegate) {
this.delegate = delegate;
}
public static MyInterface wrap(MyClass wrapped) {
return (MyInterface) Proxy.newProxyInstance(MyClass.class.getClassLoader(), new Class[] { MyInterface.class }, new WrapperClass(wrapped));
}
//you may skip this definition, it is only for demonstration
public void method1() {
System.out.println("bar");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Method m = findMethod(this.getClass(), method);
if (m != null) {
return m.invoke(this, args);
}
m = findMethod(delegate.getClass(), method);
if (m != null) {
return m.invoke(delegate, args);
}
return null;
}
private Method findMethod(Class<?> clazz, Method method) throws Throwable {
try {
return clazz.getDeclaredMethod(method.getName(), method.getParameterTypes());
} catch (NoSuchMethodException e) {
return null;
}
}
}
请注意该类:
- extends
MyClass
,以继承默认实现(其他任何方法都可以) - 实现
Invocationhandler
,以允许代理进行反射 - 可选实现
MyInterface
(以满足装饰器模式)
此解决方案使您可以覆盖特殊方法,但可以委派所有其他方法。这甚至可以与Wrapper类的子类一起使用。
请注意,该方法findMethod
尚未捕获特殊情况。
以上是 自动委派Java类的所有方法 的全部内容, 来源链接: utcz.com/qa/404764.html