码迷,mamicode.com
首页 > 其他好文 > 详细

JD设计模式之——动态代理

时间:2018-06-17 18:54:50      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:static   param   tcl   obj   参数   指定   owa   载器   subject   

动态代理的目的就是,用代理类 来帮助被代理类处理一些逻辑

1.首先我们写一个被代理类(因为代理都是面向接口编程 先来写一个接口)

package javaee.net.cn.proxy;

/**
 * 需要动态代理的接口
 */
public interface Subject{
    
    public void save();

}

2.在写一个实现类(实际被代理的对象)

package javaee.net.cn.proxy;

/**
 * 实际对象
 */
public class RealSubject implements Subject{
    
    public void save(){
       System.out.println("insert into ......");
    }
    
}

3. LogInterceptor 通过实现接口 InvocationHandler 代理实例

每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。(参考API)

package javaee.net.cn.proxy;

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

/**
 * 调用处理器实现类
 * 每次生成动态代理类对象时都需要指定一个实现了该接口的调用处理器对象
 */
public class LogInterceptor implements InvocationHandler{

    /**
     * 这个就是我们要代理的真实对象
     */
    private Object target;

    /**
     * 构造方法,给我们要代理的真实对象赋初值
     * @param subject
     */
    public LogInterceptor(Object target){
        this.target = target;
    }

    /**
     * 该方法负责集中处理动态代理类上的所有方法调用。
     * 调用处理器根据这三个参数进行预处理或分派到委托类实例上反射执行
     * @param proxy  代理类实例
     * @param method 被调用的方法对象
     * @param args   调用参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
        //在代理真实对象前我们可以添加一些自己的操作
        System.out.println("trancation start");

        //当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
        Object returnValue = method.invoke(target, args);

        //在代理真实对象后我们也可以添加一些自己的操作
        System.out.println("trancation commit");
        return returnValue;
    }
}

4.用Proxy创建代理类的实列subjectProxy

 

  Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。(参考API)

package javaee.net.cn.proxy;

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

/**
 *  动态代理演示
 *  通过分析代码可以看出Java 动态代理,具体有如下四步骤:
    通过实现 InvocationHandler 接口创建自己的调用处理器;
    通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
    通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
    通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。
 */
public class Test{
    public static void main(String[] args) {
        //代理的真实对象
        Subject realSubject = new RealSubject();      
        InvocationHandler handler = new LogInterceptor(realSubject);
        ClassLoader loader = realSubject.getClass().getClassLoader();
        Class<?>[] interfaces = realSubject.getClass().getInterfaces();
        /**
         * 该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
         */
        Subject subjectProxy = (Subject) Proxy.newProxyInstance(loader, interfaces, handler);
        
        subjectProxy.save();
        
    }

}

下面是方法运行的结果

trancation start
insert into ......
trancation commit

像是Spring的事物吧。Spring AOP管理的事物,原理也是动态代理

这是对反射和classLoader的一些补充解释

 

 



JD设计模式之——动态代理

标签:static   param   tcl   obj   参数   指定   owa   载器   subject   

原文地址:https://www.cnblogs.com/ssskkk/p/9191845.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!