代理--静态代理和动态代理

本文详细介绍了静态代理和动态代理的概念、实现方式及应用优势。通过对比分析,阐述了动态代理如何提供更灵活、简洁的代码实现,并强调了其在实际编程中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     平时我们总用到代理,这里我简单讲解一下我们用的静态代理和动态代理。
      一 、静态代理:通过代理来实现真实对象的方法,在访问的时候不需要访问真实的对象,从而实现了对真实对象的保护。
      静态代理实现:
public class UserManagerProxy implements UserManager {
    private UserManager userManager;
    
    public UserManagerProxy(UserManager userManager){
        this.userManager=userManager;
    }
    @Override
    public void addUser(String username, String password) {
        // TODO Auto-generated method stub
        checkSecurity();
        userManager.addUser(username, password);
    }
    @Override
    public void delUser(int userId) {
        // TODO Auto-generated method stub
        checkSecurity();
        userManager.delUser(userId);
    }
    private void checkSecurity(){
        System.out.println("------UserManagerImpl.checkSecurity()-------");
    }
}
    从上述代码我们可以看到checkSecurity方法出现在各个角落,复用性不强。并且我们通过public class UserManagerProxy implements UserManager可以发现一个代理方法只能代理一个真实的类,这样我们在代理其他类的时候其实并不灵活,为了解决这个问题我们采用动态代理。动态代理,其实在代理方法中并没有确定一个具体的代理类,而是通过传入一个代理方法的参数来确定代理的真实的方法。并且我们需要调用的服务也只需要写一次就可以。这样可以讲服务横向加入我们的程序中代码会更加简洁,AOP的核心思想就是动态代理,通过将服务横向加入程序来简化我们的diamante,更好的管理我们的程序。
  二 、动态代理实现:
<span style="font-size:14px;">public class SecurityHandler implements InvocationHandler {
    private Object targetObject;
    public Object createProxyInstance(Object targetObject){
        this.targetObject=targetObject;
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(), this);
        
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        checkSecurity();
        //真正的掉目标方法
        Object ret=method.invoke(targetObject, args);
        return ret;
    }
    private void checkSecurity(){
        System.out.println("------UserManagerImpl.checkSecurity()-------");
    }
} </span>
客户端代码:
<span style="font-size:14px;">public class Client {

	public static void main(String[] args){
		SecurityHandler handler= new SecurityHandler();
		UserManager usermanager=(UserManager)handler.createProxyInstance(new UserManagerImpl());
		usermanager.addUser("张三", "123");
		
	}
}</span>
总结:
 动态代理的优点:
(1)不会访问真实的类,对真实的类优保护
(2)延迟到具体实现的时候采取决定调用的方法,更加灵活。
(3)将一些服务横向加入程序,更简便,代码复用性也更强。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值