Java - 使用代理 类

Java - Using Proxy Classes

所以我有几个 classes ClassAClassC (不是我自己实现的,所以我无法修改它们的来源)。每个 class 实现了一些通用功能和一些独特功能。这些 classes 用于为数据源提供不同类型的身份验证行为。因此,例如,这是每个 class 实现的示例:

// Uses pre-configured privileged user credentials to get data
ClassA.getUsers(...)

// Saves session to allow user to log-in once and perform any operation after that without repeated authentication
ClassB.login(Username, Password)
ClassB.logout()
ClassB.getUsers(..., Username, Password)

// Uses given token to authenticate user and get data
ClassC.getUsers(..., Token)

我正在尝试为这些 class 开发一个 ProxyClass,这样我就可以像这样进行调用:

ProxyClass
  .getUsers(...);                     => calls ClassA.getUsers(...)

ProxyClass
  .authenticate(Token)
  .getUsers(...);                     => calls ClassC.getUsers(..., Token)

T obj = ProxyClass
  .authenticate(Username, Password);  => calls ClassD.login(Username, Password)

obj.getUsers(...)                     => calls ClassD.getUsers(...)
obj.logout()                          => calls ClassD.logout();

这可能吗?如果可能的话,有人可以指导我 ProxyClass 会是什么样子吗?

是否可以确保,例如,如果ClassC没有getUsers(),那么ProxyClass.authentication(Token).根本不会显示getUsers

如果代理 classes 中的方法被声明为 void,我们可以再次 return 代理 class 的实例吗? , proxy 的调用者可以链式调用吗?

如果可能的话,一个完整的解决方案肯定会很好。但我也会满足于部分的。如果我有一个好的起点,我可能可以算出其余部分。但是现在我什至不知道如何开始实施它。 :(

谢谢,AweSIM


编辑 我想我应该在 ProxyClass 中提到这一点,我的意思是 DynamicProxy class 是的。其中涉及方法调用中的反射。如果那不可能,或者不是非常复杂,我想我将不得不使用静态代理解决 classes.

当然可以。

package utils;

public class ProxyClasses {

    public static class ClassA {
        public void function1(Object arg1, Object arg2, Object arg3) {}
    }
    public static class ClassB {
        public void function1(Object arg1, Object arg2, Object arg3, String username, String password) {}
    }
    public static class ClassC {
        public void function1(Object arg1, Object arg2, Object arg3, String token) {}
    }

    public static interface ClassCommon {
        ProxyClasses function1(Object arg1, Object arg2, Object arg3); // or whatever
    }
    public static class ProxyClass implements ClassCommon {
        @Override
        public void function1(Object arg1, Object arg2, Object arg3) {
            new ClassA().function1(arg1, arg2, arg3);
        }

        public ClassCommon authenticate() {
            return new ClassCommon() {
                @Override
                public void function1(Object arg1, Object arg2, Object arg3) {
                    new ClassA().function1(arg1, arg2, arg3);
                    return this;
                }
            };
        }
        public ClassCommon authenticate(final String username, final String password) {
            ClassB classB = new ClassB();
            classB.login(username, password);
            return new ClassCommon() {
                @Override
                public void function1(Object arg1, Object arg2, Object arg3) {
                    new ClassB().function1(arg1, arg2, arg3, username, password);
                    return this;
                }
            };
        }
        public ClassCommon authenticate(final String token) {
            return new ClassCommon() {
                @Override
                public void function1(Object arg1, Object arg2, Object arg3) {
                    new ClassC().function1(arg1, arg2, arg3, token);
                    return this;
                }
            };
        }
    }
}