我有一个与java中的动态代理有关的问题.
假设我有一个Foo用方法execute和类调用的接口FooImpl implements Foo.
当我创建代理时Foo,我有类似的东西:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class[] { Foo.class },
handler);
Run Code Online (Sandbox Code Playgroud)
假设我的调用处理程序如下所示:
public class FooHandler implements InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
如果我的调用代码看起来像
Foo proxyFoo = (Foo) Proxy.newInstance(Foo.getClass().getClassLoader(),
new Class[] { Foo.class },
new FooHandler());
proxyFoo.execute();
Run Code Online (Sandbox Code Playgroud)
如果代理可以execute从Foo界面拦截上述呼叫,那么它FooImpl可以在哪里播放?也许我正在以错误的方式查看动态代理.我想要的是能够execute从具体实现中捕获调用Foo,例如FooImpl.可以这样做吗?
非常感谢
如果两个类有一些签名完全相同的方法,但这些方法没有被继承,有没有办法用公共方法定义一个接口,并使用相同的接口指向两个类的两个实例?
例如,假设一类Cat具有boolean isAlive()与另一个类Dog具有boolean isAlive()但Cat并Dog具有比其它没有共同的祖先Object和boolean isAlive()不是继承的方法。我不能修改Cat或者Dog因为它们是别人写的。我可以随意创建一个这样的界面并用它来指向猫或狗吗?
interface lovable
{
boolean isAlive();
}
void main()
{
lovable thing = new Cat(); <-- any syntax to achieve this?
love(thing);
}
void love(lovable thing)
{
if (thing.isAlive())
System.out.println("Aww.");
else
System.out.println("Eww.");
}
Run Code Online (Sandbox Code Playgroud)