美文网首页
JAVA代理模式深入了解(一)

JAVA代理模式深入了解(一)

作者: 目标技术宅 | 来源:发表于2019-06-13 14:37 被阅读0次

目前学习阶段,有问题请帮忙指出,谢谢

代理模式有三种:

  • 静态代理模式
  • jdk动态代理模式
  • cglib动态代理模式

关于为什么使用代理模式,代理模式的作用,在网上的说明已经很多了
参考https://www.javaworld.com/article/2074068/take-control-with-the-proxy-design-pattern.html
本文主要是深入了解一下Jdk代理和Cglib代理的实现原理
静态代理比较好理解,先展示一下代码,下一篇再深入了解一下Jdk动态代理的具体实现

本文代码地址

静态代理
package com.learn.design.pattern.proxy;

import lombok.AllArgsConstructor;

/**
 * 静态代理模式
 * @author  lizj
 * Date: 2019/6/13
 */
public interface StaticProxy {

    /**
     *  定义方法
     */
    void doSomething();

    /**
     * 实现对象
     */
    class AchieveObject implements StaticProxy{

        @Override
        public void doSomething() {
            System.out.println("Achieve StaticProxy");
        }
    }

    /**
     * 代理对象
     */
    @AllArgsConstructor
    class ProxyObject implements StaticProxy{

        private AchieveObject achieveObject;

        @Override
        public void doSomething() {
            System.out.println("Achieve StaticProxy before");
            achieveObject.doSomething();
            System.out.println("Achieve StaticProxy after");
        }
    }
}
jdk动态代理
package com.learn.design.pattern.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * jdk动态代理模式
 * @author lizj
 * Date: 2019/6/13
 */
public interface JdkProxy {

    /**
     * 定义方法
     */
    void doSomething();

    /**
     * 实现对象
     */
    class AchieveObject implements JdkProxy{

        @Override
        public void doSomething() {
            System.out.println("Achieve JdkProxy");
        }
    }

    /**
     * jdk动态代理对象
     */
    class ProxyObject implements InvocationHandler {

        private Object targetObj;

        public Object newProxyObject(Object targetObj){
            this.targetObj = targetObj;
            return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(), targetObj.getClass().getInterfaces(), this);
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Achieve JdkProxy before");
            Object obj = method.invoke(targetObj, args);
            System.out.println("Achieve JdkProxy after");
            return obj;
        }
    }
}
cglib动态代理:
package com.learn.design.pattern.proxy;

/**
 * 实现对象
 * @author lizj
 * Date: 2019/6/13
 */
public class CglibObject {

    public void doSomething(){
        System.out.println("do something");
    }
}
package com.learn.design.pattern.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * cglib代理
 * @author lizj
 * Date: 2019/6/13
 */
public class CglibProxy implements MethodInterceptor{

    private Object targetObject;

    public Object newProxyObject(Object targetObject){
        this.targetObject = targetObject;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targetObject.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("do something before");
        Object result = methodProxy.invoke(targetObject, objects);
        System.out.println("do something after");
        return result;
    }
}

相关文章

网友评论

      本文标题:JAVA代理模式深入了解(一)

      本文链接:https://www.haomeiwen.com/subject/hettfctx.html