我正在处理休眠,试图通过使用访问者模式找出代理实例背后的运行时类。然后我想出了一个AbstractVisitable
方法,但我想知道它是否总是会产生正确的结果。
考虑以下代码:
interface Visitable {
public void accept(Visitor v);
}
interface Visitor {
public void visit(Visitable visitorHost);
}
abstract class AbstractVisitable implements Visitable {
@Override
public void accept(Visitor v) {
v.visit(this);
}
}
class ConcreteVisitable extends AbstractVisitable {
public static void main(String[] args) {
final Visitable visitable = new ConcreteVisitable();
final Visitable proxyVisitable = (Visitable) Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class<?>[] { Visitable.class }, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
return method.invoke(visitable, args);
}
});
proxyVisitable.accept(new Visitor() {
@Override
public void visit(Visitable visitorHost) {
System.out.println(visitorHost.getClass());
}
});
}
}
这使得 a ConcreteVisitable
which 从 继承accept
方法AbstractVisitable
。在 c++ 中,我认为这是有风险的,因为this
在 AbstractVisitable 中可能引用AbstractVisitable::this
,而不是ConcreteVisitable::this
。我担心某些情况下的代码会打印class AbstractVisible
. 然而,上面的代码输出class ConcreteVisitable
,即使我将真实类型隐藏在动态代理后面(我能想到的最困难的情况)。上面的抽象访问者方法是否可以保证工作,或者这种方法是否存在一些缺陷?
this
Java 中关于指针的保证是什么?