我从以下链接中看到了以下代码:http://javapapers.com/design-patterns/proxy-design-pattern/
我无法理解以下代码:
Animal proxy = (Animal) Proxy.newProxyInstance(realSubject.getClass()
.getClassLoader(), realSubject.getClass().getInterfaces(),
new AnimalInvocationHandler(realSubject));
有人可以提供一些资源/指针来帮助我理解,因为我没有做任何关于反思的工作。
import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
interface Animal {
public void getSound();
}
class Lion implements Animal {
public void getSound() {
System.out.println("Roar");
}
}
class AnimalInvocationHandler implements InvocationHandler {
private Object realSubject = null;
public AnimalInvocationHandler(Object realSubject) {
this.realSubject = realSubject;
}
public Object invoke(Object proxy, Method m, Object[] args) {
Object result = null;
try {
result = m.invoke(realSubject, args);
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
}
public class ProxyExample {
public static void main(String[] args) {
Animal realSubject = new Lion();
Animal proxy = (Animal) Proxy.newProxyInstance(realSubject.getClass()
.getClassLoader(), realSubject.getClass().getInterfaces(),
new AnimalInvocationHandler(realSubject));
proxy.getSound();
}
}
答案 0 :(得分:0)
这是什么意思?它创建一个新的Object(返回类型),使用类的ClassLoader和Interfaces进行代理。最后,它创建了一个新的AnimalInvocationHandler,然后委托(即调用)代理对象。
来自Proxy -
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) Returns an instance of a proxy class for the specified interfaces that dispatches method invocations to the specified invocation handler.“代理人”包裹着“狮子”并像狮子一样行事,尽管它不是“狮子”。 最后,或许这张照片将澄清所涉及的关系 -
答案 1 :(得分:0)
问题的一部分可能是,正如所写,它似乎没有做任何非常有用的事情: - )
它设置了一个对象,proxy
,它实现了Animal,但在源代码中没有可见的实际类定义。相反,对proxy
上的任何方法的调用都会进入AnimalInvocationHandler.invoke方法。这是标准的java.lang.Proxy东西,通常在你有许多非常类似的方法实现时使用(相反,你有一段实现代码根据调用的方法做一些稍微不同的东西)。
这里的区别在于,invoke方法直接传递给底层对象上的匹配方法,没有添加任何有用的行为(我猜它会捕获任何异常,但我认为这不是预期的,它们只是吞下了大量的反射教学清晰度相关的东西)。我想这更像是一个真正的代理。
据推测,这个想法是你会在传递给真实方法之前或之后添加一些行为(即在m.invoke(realSubject, args);
行的上方或下方) - 如果他们添加了评论说{{}会更加清楚1}}或其他什么。