我想向将在运行时生成的对象添加一些功能。但是,该对象的接口非常大(并且不在我的控制之下)。我想将对象包装在自己的类中,该类添加了我想要的功能并将标准接口功能委托给原始对象-
在Java中有任何方法可以执行此操作,而无需为每个对象创建一行复制粘贴委托方法接口中的方法?
我要避免的是:
class MyFoo implements Foo {
Foo wrapped;
void myMethod() { ... }
void interfaceMethod1() wrapped.interfaceMethod1();
int interfaceMethod2() wrapped.interfaceMethod2();
// etc etc ...
}
我更喜欢:
class MyFoo implements Foo {
Foo wrapped;
void myMethod() { ... }
// automatically delegate undefined methods to wrapped object
}
听起来您需要动态代理并仅拦截要覆盖的方法。
动态代理类是实现在运行时指定的接口列表的类,这样,通过该类实例上的接口之一进行的方法调用将被编码,并通过统一接口分配给另一个对象。因此,动态代理类可用于为接口列表创建类型安全的代理对象,而无需诸如编译时工具之类的预生成代理类。
对动态代理类的实例的方法调用将分派到该实例的调用处理程序中的单个方法
,并且它们使用java.lang.reflect.Method对象进行编码,该对象标识了所调用的方法,并且包含Object类型的数组论点
(我的重点)
通过实现InvocationHandler,您只需创建一个方法即可接收对该对象的每次调用(实际上是您上面所述的方法)
问题内容: 假设我有一个包含许多公共方法的类: 现在,我想创建一个 包装器 类,该 包装器 类将所有方法委托给包装好的实例( 委托 ): 现在,如果MyClass有很多方法,我将需要重写它们中的每一个,这些方法或多或少与只是“委托”的代码相同。我想知道是否可以做一些魔术来自动调用Java中的方法(因此Wrapper类需要说“嘿,如果您对我调用方法,只需去 委托 对象并对其调用此方法)。 顺便说一句
问题内容: 我对Java中的委托和回调的术语有些误解。 那又如何实现呢? 问题答案: 这是一个回调。根据维基百科: 在计算机编程中,回调是对一段可执行代码的引用,该可执行代码作为参数传递给其他代码。 因此,让我们看一下可执行代码: 在这里,参数是对type对象的引用。由于该引用作为参数传递,因此它是一个回调。 委托由对象内部完成-与方法的调用方式无关。例如,如果变量不是参数,而是实例变量: …那将
如果没有,是否有一种简洁的方法来设置类加载器的上下文(比方说,从特定类/库调用的所有内容都应该使用相同的类加载器)。
我想创建没有按钮的消息框,这将消失,例如2.5秒后。我知道我可以使用并将其放入线程中而不是杀死它,但也许还有更好的方法。如果没有,如何创建空消息框?
问题内容: Java中的“自动递增”字母-这可能吗?从A到Z而没有第三方库? 问题答案: 是的,您可以这样做: 类型转换也是可能的:
我试图理解继承与委派的斗争,以及如何实现这两者。我的问题是为什么我要用Kotlin的方式用by关键字实现委派?我觉得太过分了。 让我给你举个例子。我们有一个可以点餐的应用程序。这款应用名为DeliveryQueen。 下面是Java示例: Kotlin示例#1没有明确使用by关键字: