详解Java动态代理

代理模式相信大家都很了解,而动态代理模式在许多开源框架像Srping,Mybatis等使用的很广泛,下面通过一个动态代理的实例,已经趴一趴Java动态代理的源码来进行详解。

 

1:这里新建一个person接口,里面有一个测试方法:

package com.proxy;

/**
 * @author: shichao
 * @date: 2018/12/6
 * @description:
 */
public interface Person {

    void doSomeWork();
}

2:下面编写一个我们要进行代理的target类:

package com.proxy;

/**
 * @author: shichao
 * @date: 2018/12/6
 * @description:
 */
public class Sc implements Person {
    @Override
    public void doSomeWork() {
        try {
            Thread.currentThread().sleep(2000);
            System.out.println("SC is do something");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

3:编写实现了jdk提供的InvocationHandler代理类Handle:

package com.proxy;

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

/**
 * @author: shichao
 * @date: 2018/12/6
 * @description:
 */
public class PersonInvoctionHandle<T> implements InvocationHandler {

    //被代理对象
    T target;

    public PersonInvoctionHandle(T target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("开始时间:"+System.currentTimeMillis());
        Object res  = method.invoke(target,args);//调用代理方法
        System.out.println("结束时间:"+System.currentTimeMillis());

        return res;
    }
}

4:使用Proxy生成动态代理对象:

package com.proxy;

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

/**
 * @author: shichao
 * @date: 2018/12/6
 * @description:
 */
public class proxyTest {

    public static void main(String[] args) {
        Person sc = new Sc();

        //获取代理handle
        InvocationHandler invocationHandler = new PersonInvoctionHandle<Person>(sc);

        //获取动态代理对象
        Person proxy = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(),new Class<?>[]{Person.class},invocationHandler);
        proxy.doSomeWork();
    }
}

5:执行结果:

开始时间:1544088511407
SC is do something
结束时间:1544088513411

 

代码解析:java做的也是对传入的类进行相关的克隆,再通过反射生成相关的代理对象。

详解Java动态代理