设计模式之代理模式

来源:互联网 发布:剑灵龙族捏脸数据 编辑:程序博客网 时间:2024/06/11 18:32

静态代理就不叙述了,就是多个接口实现类组合和继承复写两种方式。

动态代理:JDK动态代理(组合方式)

public interface ProxyAble {void proxy();}

public class Proxy1 implements ProxyAble{public void proxy() {System.out.println("我是被代理类。。");}}

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class MyHandler implements InvocationHandler{private Object obj;public MyHandler(Object obj){this.obj = obj;}/* * proxy被代理对象 * method被代理对象方法 * args被代理对象参数 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("我是代理类");method.invoke(obj);return null;}}
import java.lang.reflect.Proxy;import java.util.logging.Handler;/* * JDK动态代理测试类 */public class ProxyTest {public static void main(String[] args) {Proxy1 p = new Proxy1();MyHandler  myHandler = new MyHandler(p);ProxyAble proxyAble = (ProxyAble)Proxy.newProxyInstance(p.getClass().getClassLoader(), p.getClass().getInterfaces(), myHandler);//生成一个代理p的类实现ProxyAble接口proxyAble.proxy();}}

我是代理类
我是被代理类。。



动态代理:Cglib动态代理(继承)
public class Cglib {void go(){System.out.println("我是被代理类");}}
import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor {private Enhancer enhancer = new Enhancer();public Object getProxy(Class clazz){//设置创建子类的类enhancer.setSuperclass(clazz);enhancer.setCallback(this);return enhancer.create();}/* * obj目标类的实例 * m目标方法的反射对象 * args方法参数 * proxy代理类 * *///拦截所有目标类方法的调用@Overridepublic Object intercept(Object obj, Method m, Object[] args, MethodProxy proxy) throws Throwable {//代理类调用父类的方法    proxy.invokeSuper(obj, args);    System.out.println("我是代理类");return null;}}

public class CglibTest {public static void main(String[] args) {CglibProxy proxy = new CglibProxy();Cglib c = (Cglib)proxy.getProxy(Cglib.class);c.go();}}

我是被代理类
我是代理类

原创粉丝点击