Java中的JDK动态代理

所谓代理,其实就是相当于一个中间人,当客户端需要服务端的服务时,不是客户直接去找服务,而是客户先去找代理,告诉代理需要什么服务,然后代理再去服务端找服务,最后将结果返回给客户。

在日常生活中,就拿买火车票来比喻。以前买票,都是需要到火车站去买的,但是有些人距离火车站太远不方便去,来来回回总是很麻烦。于是铁道部就在城市的各个地方增设一个火车票代售点,在这个代售点就可以买票而不用去火车站了。这里,这个代售点就相当于一个代理,可以提供火车站所提供的服务。

下面说说JAVA中的代理

代理的实现又分为静态代理和动态代理,

一.静态代理

静态代理意思就是静态的,不能改变的,客户,服务,代理这三者是已经决定好了的。它的实现需要一个接口和这个接口的实现类。

这个接口就是服务端所提供的服务。

比如下面的代码:

//服务
interface Station{
void sellTickit();
} //服务提供类
class SubStation implements Station{
public void sellTickit(){
System.out.println("卖火车票总站");
}
} //服务代理类
class ProxyStation implements Station{ private Station station = null; public ProxyStation(Station station){
this.station = station;
} public void sellTickit(){
System.out.println("这里是代售点,需要去总站拿票");
station.sellTickit();
System.out.println("已经从总站拿到票"); }
} public class ProxyTest{
//此处调用就相当于客户端
public void static main(String[] args){
Station station = new ProxyStation(new SubStation());
station.sellTickit();
}
} //输出结果:
//这里是代售点,需要去总站拿票
//卖火车票总站
//已经从总站拿到票
sellTickitsellTickitsellTickitsellTickitsellTickit

二.动态代理

动态代理的实现又分为JDK动态代理和CGLIB动态代理,这里先只说JDK动态代理。动态就是相对于静态的,代理类并不是一开始就有的,而是动态生成的。

此动态代理同样需要一个接口和此接口的实现类,看如下代码

//服务
interface Station{
void sellTickit();
} //服务提供类
class SubStation implements Station{
public void sellTickit(){
System.out.println("卖火车票总站");
}
} class MyInvocationHandler implements InvocationHandler{ Object target = null;
public MyInvocationHandler(Object obj){
this.target = obj;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("这里是代售点,需要去总站拿票");
Object result = method.invoke(target, args);
System.out.println("已经从总站拿到票");
return result;
}
} public class ProxyTest {
public static void main(String[] args){
SubStation subStation = new SubStation();
Station proxyStation = (Subject) Proxy.newProxyInstance(subStation .getClass().getClassLoader(),
subStation .getClass().getInterfaces(),
new MyInvocationHandler(subStation ));
proxyStation.sellTickit();
}
}
Proxy.newProxyInstance方法服务提供类的类加载器服务器提供类的接口代理方法调用处理类proxyStation.sellTickit()$Proxy0hMyInvocationHandlerh.targetSubStation$Proxy0$Proxy0MyInvocationHandler.invokeMyInvocationHandler.invokeproxymethodargs$Proxy0