自动委派Java类的所有方法

Walkeros:

假设我有一个包含许多公共方法的类:

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魔术函数来拦截该调用)。

科隆A:

也许ProxyJava 的动态可以帮助您。因此,仅在您因此使用接口时才起作用。在这种情况下,我将调用接口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尚未捕获特殊情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

以编程方式调用Java类中的所有方法

跟踪所有方法和类

如何在Python中将所有方法调用委派给C#DLL

Java使用新类向现有类添加功能,同时仍公开先前类的所有方法

自动查找一次使用的所有方法

在Java中继承抽象类时,是否需要再次实现接口的所有方法?

(Java) 将构造函数中的参数传递给类的所有方法

类中所有方法的抽象方法装饰器

字节好友-如何委派私有方法?

我可以获得类的所有方法吗?

如何显示特定类或** kwargs之类的所有方法?

在哪里可以找到UIATarget类的所有方法?

是否可以在类的所有方法上设置断点?

如何避免激活类中的所有方法?

Swift 类中所有方法的 LLDB 断点

响应所有方法调用的Python类的实例

获取类中所有方法的属性列表

为什么所有方法都不从类继承?

获取类的所有方法(包括继承的Java 8默认方法)的新方法是什么?

PHP,解析特定命名空间的所有类,并列出这些类的所有方法

类中的所有方法,将所有未知函数传递给类中的实例

是否有包含标准库中所有方法描述符的 Java 类库“头文件”?

具有许多私有方法的Java测试类

获取所有方法

如何使用ASM Java库获取Jar中存在的类的内部类中的所有方法?

Java-如何允许类的所有方法访问在构造函数中初始化的数组?

如果接口和抽象类都具有相同的方法,那么哪种方法最好将所有方法都覆盖到我的Java类中?

Aspectj @Around pointcut Java中的所有方法

Java超类中的常规调用私有方法