最近与代理对象一起工作,我遇到了困难的问题......我想分享它并听取你的意见......也许是一个解决方案......如果问题被证明是有效的。
使用动态代理,想法是将工作委托给另一个class
实现InvocationHandler
interface
.真实或其他代理)使用反射。你必须有一个interface
that a concrete
class
,我们喜欢代理它的对象,实现。所以我们使用界面。
我认为这件事是因为代理对象只有第一个调用的方法被拦截......这意味着:如果在对象的方法内部concrete
(类是具体的对象,而不是接口)调用其他实例方法,这些方法将由concrete
对象直接调用,而不是通过代理(在此之前不再考虑调用处理程序)。我知道“动态代理”的类被认为是 的子类interface
,但不是该类的子concrete
类。所以在concrete
类内部,“this”关键字不能引用代理对象,只要代理对象类不是子类型of concrete
..,实际上是“动态代理”的“兄弟”,concrete
因为concrete
和类interface
.
请看一下下面的代码场景,我发现了一个相当有问题的情况。
public class Example
{
static interface OutputerInterface
{
String getText();
void out();
void setText(String data);
}
static class Outputer implements OutputerInterface {
private String txt;
public Outputer()
{
this.txt = null;
}
@Override
public String getText()
{
return txt;
}
@Override
public void setText(String data)
{
this.txt = data;
}
@Override
public void out () {
String text = this.getText();
System.out.println (text);
}
}
static class OutputerInvocationHandler implements InvocationHandler {
private OutputerInterface outputer;
public OutputerInvocationHandler(OutputerInterface concreteEntity)
{
this.outputer = concreteEntity;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
String methodName = method.getName();
System.out.println("Intercepted " + methodName);
if (methodName.equals("getText"))
{
if (this.outputer.getText() == null) { // only if not setted
this.outputer.setText("Hi, i am outputer");
}
}
return method.invoke(outputer, args);
}
}
static OutputerInterface proxify (OutputerInterface entity) {
return (OutputerInterface) Proxy.newProxyInstance(
Outputer.class.getClassLoader(),
Outputer.class.getInterfaces(),
new OutputerInvocationHandler(entity));
}
public static void main(String[] args)
{
OutputerInterface outputer;
outputer = proxify (new Outputer());
String text = outputer.getText();
System.out.println (text); // this works!
outputer = proxify (new Outputer());
outputer.out(); // this doesn´t works
}
}
有没有办法确保无论是否直接从代理调用 getText() 都会被拦截。谢谢!问候!胜利者。