【问题标题】:How to make object returned by java.lang.reflect.Proxy.newProxyInstance() to extend other class如何使 java.lang.reflect.Proxy.newProxyInstance() 返回的对象扩展其他类
【发布时间】:2012-01-17 00:44:20
【问题描述】:
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h); 

返回指定接口的代理类实例,该接口将方法调用分派到指定的调用处理程序。

我需要将此方法返回的实例封装(例如,封装到其他类中),以便它也可以扩展其他类。所以最终类将扩展一个类并实现指定的接口。

要扩展的类是:

public class IProxy {

ObjectRef oref;

public IProxy(ObjectRef oref) {
    this.oref = oref;
}

}

所以过程应该是:

MyInterface() mi=(MyInterface) newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h);

// some magic trick

最后我希望有一个类的实例,它扩展了 IProxy 并实现了 mi 实现的所有接口。

【问题讨论】:

  • 这是不可能的。您能否提供更多关于它为什么应该扩展该类的详细信息 - 可能还有其他方法可以实现您想要的。

标签: java interface encapsulation extend


【解决方案1】:

你不能这样做,因为从newProxyInstance返回的对象已经继承自其他一些类,你不能从Java中的两个类继承。

您需要将oref 保留为实现InvocationHandler 接口的类的实例变量。你将在InvocationHandler的构造函数中初始化oref,并提供一个接口通过方法访问oref

public interface IProxy {
    ObjectRef getOref();
}

您的InvocationHandler 应该通过返回其oref 成员来响应getOref 的调用。

【讨论】:

  • 但即便如此:他如何在不直接引用类加载器的情况下实现 IProxy 的接口?
  • 他不会“实现”Java 意义上的那个接口。相反,当它检测到被调用的方法是来自IProxygetOref 时,它将响应getOref 的调用,作为其在invoke(Object, Method, Object[]) 方法实现内部的调度例程的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多