`
wuhoujian322
  • 浏览: 63506 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

动态代理模式

阅读更多

在正式开始动态代理模式的介绍之前,先同大家一起回顾一下代理。

那么如何理解代理呢?我们在程序中为了提供额外的或不同的操作,插入的用来代替实际对象的对象,通常充当着中间人的角色。

 

简单代理示例代码:

package com.tu.test.proxy;

 

public interface Interface {

void doSomething();

void somethingElse(String arg);

}

 

package com.tu.test.proxy;

 

public class RealObject implements Interface {

 

@Override

public void doSomething() {

System.out.println("doSomething....");

}

 

@Override

public void somethingElse(String arg) {

System.out.println("somethingElse..." + arg);

}

}

 

package com.tu.test.proxy;

 

public class SimpleProxy implements Interface {

private Interface proxied;

public SimpleProxy(Interface proxied) {

this.proxied = proxied;

}

 

@Override

public void doSomething() {

System.out.println("SimpleProxy doSomething...");

proxied.doSomething();

}

 

@Override

public void somethingElse(String arg) {

System.out.println("SimpleProxy somethingElse..." + arg);

proxied.somethingElse(arg);

}

}

 

package com.tu.test.proxy;

 

public class SimpleProxyDemo {

public static void consumer(Interface iface){

iface.doSomething();

iface.somethingElse("proxy");

}

 

public static void main(String[] args) {

consumer(new RealObject());

consumer(new SimpleProxy(new RealObject()));

}

}

 

认识了简单代理,现在开始认识动态代理!

动态代理就是动态地创建代理并动态地处理对所代理方法的调用。

使用了动态代理,所有调用都会被重定向到一个单一的调用处理器(一个实现InvocationHandler接口的类)上。

说太多没多大意思,结合具体示例代码来理解。

package com.tu.test.proxy;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

 

public class DynamicProxyHandler implements InvocationHandler {

private Object proxied;//要被代理的对象

 

public DynamicProxyHandler(Object proxied) {

this.proxied = proxied;

}

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

System.out.println("proxy:" + proxy.getClass() + ",method:" + method + ",args:" + args);

if (args != null) {

for (Object arg : args) {

System.out.println(" " + arg);

}

}

//执行method.invoke方法之前可以进行方法的过滤,判断method.getName()

return method.invoke(proxied, args);

}

}

 

package com.tu.test.proxy;

 

import java.lang.reflect.Proxy;

 

public class SimpleDynamicProxy {

public static void consumer(Interface iface){

iface.doSomething();

iface.somethingElse("proxy");

}

 

public static void main(String[] args) {

RealObject real = new RealObject();

consumer(real);

 

//insert a proxy and call method again

/**

* 创建一个动态代理:Proxy.newProxyInstance(参数1:通过一个已经加载的对象获取类加载器,参数2:该代理实现的接口列表,参数3:单一的调用处理器InvocationHandler)

* **/

consumer((Interface)Proxy.newProxyInstance(Interface.class.getClassLoader(), new Class[]{Interface.class}, new DynamicProxyHandler(real)));;

}

}

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics