黑马程序员技术交流社区
标题:
动态代理的问题
[打印本页]
作者:
aion2013tian
时间:
2013-12-27 18:04
标题:
动态代理的问题
package test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author Xing,Ming
* @version 2013年12月27日 下午4:52:08
*/
public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
InvocationHandler handler = new DynamicSubject(realSubject);
Class<?> classType = handler.getClass();
/**
* 这行代码返回的到底是个什么?就是Subject类型?还是强制转换了?
* 为什么执行pro.request();
* 之后会调用DynamicSubject类里面的那个method.invoke方法
*/
Subject pro = (Subject) Proxy.newProxyInstance(classType
.getClassLoader(), realSubject.getClass().getInterfaces(),
handler);
pro.request();
}
}
interface Subject {
public void request();
}
class RealSubject implements Subject {
public void request() {
System.out.println("From real subject");
}
}
class DynamicSubject implements InvocationHandler {
private Object sub;
public DynamicSubject(Object sub) {
this.sub = sub;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
method.invoke(sub, args);
return null;
}
}
复制代码
为什么会调用invoke方法,这个方法到底是做什么的啊?
作者:
hurryup
时间:
2013-12-27 19:01
动态代理机制:其实动态代理机制最核心的就是InvocationHandler这个接口(调用处理器)。InvocationHandler是代理实例的调用处理程序实现的接口。每个代理实例都有 一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的invoke方法。
method.invoke(sub, args);的sub对象映射了new DynamicSubject(realSubject);的realSubject,而该对象是RealSubject的一个实例,并实现了interface Subject,
Subject pro = (Subject) Proxy.newProxyInstance(classType
.getClassLoader(), realSubject.getClass().getInterfaces(),
handler);
就是创建一个代理类的实例pro,并加载关联的调用处理器类,关联的目标接口和目标类。
pro.request();
就是调用关联目标类的request()方法,即用代理实例对象pro调用目标类RealSubject中的request().
作者:
其LovE斤
时间:
2013-12-27 19:35
InvocationHandler 是一个接口。接口就是一种规则。
newProxyInstance 的参数中有InvocationHandler 类型的参数。说明这个方法要实现这种规则。
这个接口只有一个方法 invoke
看invoke的参数。。三个参数 代理实例 方法 object[ ]
分别对应 你代理对象代理的是谁 你代理的谁要执行的方法 要执行方法的参数。
可以看出 这个方法 是代理实现的核心。 代理时要替别人做事情。
invoke方法正好明确了 你要替谁做 做什么 怎样做。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2