自动委派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

回到顶部