来自外部API的服务返回给我,但我不能修改
MyClass instance = ServiceUtil.getThing();我想扩展这个返回的类,并添加/覆盖一个方法,但保留其他方法,比如150个方法。
private class MyWrapperClass extends MyClass(){
public MyWrapperClass(){super();}
@Override public String toString(){ return "Blocked toString"; }
}有没有办法强制这种从返回的MyClass实例到我新创建的特定子类型的“转换”?
注意:请不要建议使用构造函数、传递原始对象以及必须复制和实现150个方法来调用包装对象的方法
发布于 2012-08-16 17:30:45
如果MyClass是一个接口,请查看java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler。
您可以实现始终执行相同操作的动态代理。它是,始终将控制权传递给您的原始实现...方法X被调用时除外。
类似于:
class MyHandler implements InvocationHandler {
Object invoke(Object proxy, Method method, Object[] args) {
if (method is the one you want to change) {
do whatever
else
return method.invoke(originalObject, args);
}
}注意:无论如何您都必须创建此代理实现:
MyClass original = ServiceUtil.getThing();
MyClass proxy = (MyClass) Proxy.newProxyInstance(
MyClass.class.getClassLoader(), // classloader to use
new Class[] { MyClass.class }, // interfaces to implement
new MyHandler()); // who does the dirty work when methods are invoked发布于 2012-08-16 17:44:48
我希望我没弄错:你有一个
MyClass instance = ServiceUtil.getThing();但是想要这样的东西
MyWrapperClass instance = (MyWrapperClass) ServiceUtil.getThing();(这显然不起作用,即使MyWrapperClass扩展了MyClass)。
解决方案是基于MyClass创建一个新的MyWrapperClass实例,很抱歉地说,使用构造函数是一种很好的方法(public MyWrapperClass(MyClass myClass))。
发布于 2012-08-16 17:26:06
请不要建议这样的方法:创建构造函数,传递原始对象,然后必须复制和实现150个方法来调用包装的对象
你的意思是说“装饰”不是你想看的选项,对吧?
但是如果MyClass是一种接口类型,你必须定义那150多个方法,将149个方法调用委托给被修饰的方法并覆盖那个方法,那么修饰对你来说就是一个问题。
如果MyClass是一个类类型,那么您不需要编写这149个方法,对吧?还是我完全误会你了?
https://stackoverflow.com/questions/11984165
复制相似问题