假设我有一个包含许多公共方法的类:
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;
}
}
}
请注意该类:
MyClass
,以继承默认实现(其他任何方法都可以)Invocationhandler
,以允许代理进行反射MyInterface
(以满足装饰器模式)此解决方案使您可以覆盖特殊方法,但可以委派所有其他方法。这甚至可以与Wrapper类的子类一起使用。
请注意,该方法findMethod
尚未捕获特殊情况。
问题内容: 我想向将在运行时生成的对象添加一些功能。但是,该对象的接口非常大(并且不在我的控制之下)。我想将对象包装在自己的类中,该类添加了我想要的功能并将标准接口功能委托给原始对象- 在Java中有任何方法可以执行此操作,而无需为每个对象创建一行复制粘贴委托方法接口中的方法? 我要避免的是: 我更喜欢: 问题答案: 听起来您需要动态代理并仅拦截要覆盖的方法。 动态代理类是实现在运行时指定的接口列
本文向大家介绍java 详解类加载器的双亲委派及打破双亲委派,包括了java 详解类加载器的双亲委派及打破双亲委派的使用技巧和注意事项,需要的朋友参考一下 java 详解类加载器的双亲委派及打破双亲委派 一般的场景中使用Java默认的类加载器即可,但有时为了达到某种目的又不得不实现自己的类加载器,例如为了达到类库的互相隔离,例如为了达到热部署重加载功能。这时就需要自己定义类加载器,每个类加载器加载
我知道如何在直接依赖的ViewController之间建立“正常”委派。所以如果我说,我必须从一个视图发送一个消息到它上面的一个,我知道怎么做。但是,如果两者之间有更多的ViewControllers,我如何设置委托呢? 假设我有一个根据方案的设置: ViewController1->ViewController2->ViewController3(通过ButtonPressed)(通过Butto
问题内容: java中的继承和委托有什么区别? 如何在我的项目中使用以下示例?请你指导我。我了解继承,但对委托没有太多了解。因此,请给出适当的理由。我为什么要用这个? 问题答案: 当您委托时,您只是在调用一个知道必须做什么的类。您并不真正在乎它是 如何 执行的,您所 关心的 只是您正在调用的类知道需要做什么。 如果我是您,我将创建一个接口并命名该接口(或类似名称的接口),该接口具有一个名为的方法。
如果一个类收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器执行,如果父加载器还存在其父加载器,则进一步向上委托,依次递归,请求将最终到达顶层的启动类加载器,如果父类加载器可以完成父加载任务,就成功返回,如果父加载器无法完成加载任务,子加载器才会尝试自己去加载,这就是双亲委派模型。 双亲委派模式的优势: 避免重复加载; 考虑到安全因素,java核心api中定义类型不会被随意替
1.1 加载 将字节码数据从各种不同的数据源(class 文件、jar 文件等)中读到 JVM 中,映射为 Java 认可的数据结构(Class 对象)。 1.2 连接 验证:过滤掉不合法的 class 文件。 准备:为静态变量分配内存,此时不进行实例化,采用默认值。 解析: 1.3 初始化为静态变量赋予正确的初始值。 2. 类加载器类型 启动类加载器 扩展类加载器 应用类加载器 自定义类加载器