动态代理

来源:互联网 发布:js网页编程 编辑:程序博客网 时间:2024/06/05 08:05

动态代理

1.动态代理类的角色与静态代理的角色相同。
2.动态代理的代理类是动态生成的。
3.实现方式分为两种:基于接口的代理类和基于类的代理类

一个动态代理类一般代表某一类业务(例如日志监控,性能监控等),一个动态代理类可以代理多个类。

实现方法:

1.定义一个ProxyInvocationHandler类实现接口InvocationHandler
2.把真实类传入给代理类
3.重写函数invoke,并可以在其中添加执行自定义代码
4.获取代理类

代理类

package com.dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * @author Duoduo * @version 1.0 * @date 2017/5/13 17:30 */public class ProxyInvocationHandler implements InvocationHandler {    private Object target;//目标类-->真实类    public ProxyInvocationHandler(Object target) {        this.target = target;    }    /**     * 获取代理类     * @return     */    public Object getProxy() {        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);    }    /**     * 重写调用函数,并添加自定义代码     * @param proxy     * @param method     * @param args     * @return     * @throws Throwable     */    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        log(method.getName());        Object result = method.invoke(target, args);        return result;    }    /**     * 自定义日志输出函数     * @param methodName     */    private void log(String methodName) {        System.out.println("Execute method : " + methodName);    }}

接口类

package com.dynamicproxy;import com.duoduo.User;/** * @author Duoduo * @version 1.0 * @date 2017/5/13 17:32 */public interface IUserDao {    void  add(User user);    void  update(User user);}

接口实现类

package com.dynamicproxy;import com.duoduo.User;/** * @author Duoduo * @version 1.0 * @date 2017/5/13 21:00 */public class UserDaoImpl implements  IUserDao {    @Override    public void add(User user) {        System.out.println("add user");    }    @Override    public void update(User user) {        System.out.println("update user");    }}

测试类

package com.dynamicproxy;import com.duoduo.User;/** * @author Duoduo * @version 1.0 * @date 2017/5/13 21:01 */public class Test {    public static void main(String[] args) {        IUserDao userDao = new UserDaoImpl();        ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler(userDao);        IUserDao proxy = (IUserDao)proxyInvocationHandler.getProxy();        proxy.add(new User());    }}

测试结果

Execute method : addadd user
0 0