代理模式之动态代理

动态代理:

根据目标对象,在程序运行期自动装配目标对象的代理对象.

优点:可以根据不同的对象,动态装配出对应的代理对象

缺点:采用了反射,导致运行速度会有延迟,JDK的动态代理必须是实现了接口的类(如果不实现接口,可以使用CGLIB)

接口类:UserManager.java

package com.djpowernode.spring;

public interface UserManager {

    public void addUser(String username, String password);
}

实现类:UserManagerImpl.java

package com.djpowernode.spring;

public class UserManagerImpl implements UserManager {

    @Override
    public void addUser(String username, String password) {
        System.out.println("--------UserManagerImpl.addUser-----------------");
    }

}

动态代理类:UserManagerImplProxy.java

package com.djpowernode.spring;

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

public class UserManagerImplProxy implements InvocationHandler {

    private Object targetObject;
    
    public Object createObjectProxy(Object targetObject){
        this.targetObject = targetObject;
        //targetObject.getClass.getClassLoader取得目标对象的类加载环境
        //targetObject.getClass.getInterfaces取得目标对象的实现的所有接口
        //this,代理对象,就是该代理类本身,需要加入新的功能checkScurity
        //Proxy.newProxyInstance根据取得的信息,自动装配出代理对象并返回(在程序运行期自动装配)
        return Proxy.newProxyInstance(targetObject.getClass.getClassLoader,
 targetObject.getClass.getInterfaces,
 this);
    }
    
    //重新InvocationHandler中的invoke方法,会在生成代理对象的时候,自动执行该方法
    //根据调用的方法的不同,自动对该方法进行一次封装,执行对应的方法就是在执行invoke方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
 throws Throwable {
        Object rect = null;
        //根据规则,只对add开始的方法代理,类型与Spring中代理实现(Pointcut,Advice)
        if(method.getName.startsWith("add123")){
 checkScurity;
 //method.invoke取得对象执行的某个方法并执行该方法
 rect = method.invoke(targetObject, args);
 }
        return rect;
    }
    
    //在代理类中根据需求需要添加的功能
    private void checkScurity{
        System.out.println("-----------checkScurity--------------");
    }

}

测试类:Client.java

package com.djpowernode.spring;

public class Client {

    /**
     * @param args
     */
    public static void main(String[] args) {
//        UserManager userManager = new UserManagerImpl;
        UserManagerImplProxy proxy = new UserManagerImplProxy;
        UserManager userManager = (UserManager) proxy.createObjectProxy(new UserManagerImpl);
        userManager.addUser("张三", "123456");
    }

}

本文为头条号作者发布,不代表今日头条立场。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值