静态代理和JDK动态代理

公用接口

首先要定义一个公共的接口,供代理类和被代理类实现

public interface IUserDao {
 
	void get();
	void set();
	
}
被代理类
/**
 *  被代理类
 * @author Murphy
 *
 */
public  class UserDao implements IUserDao {

	@Override
	public void get() {
		System.out.println("我是get方法");
	}

	@Override
	public void set() {
		System.out.println("我是set方法");
	}

静态代理

静态代理,简单点来说就是在程序运行之前,代理类和被代理类的关系已经确定。

/**
 * 代理类
 * @author Murphy
 *
 */
public class UserDaoProxy implements IUserDao{

	private UserDao  user= new UserDao();
	
	@Override
	public void get() {
		System.out.println("我是静态代理类,我要加一段执行get方法的日志");
		user.get();
	}

	@Override
	public void set() {
		System.out.println("我是静态代理类,我要加一段执行set方法的日志");
		user.set();
	}

}

优点:
代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用
代理对象可以扩展目标对象的功能
代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度

缺点:
因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护

JDK动态代理

JDK提供了动态代理的方式,可以生成代理类,解决了静态代理的不足。

/**
 * 动态代理
 * @author Murphy
 *
 */
public class DynamicProxy implements InvocationHandler{

	private IUserDao user = null; 

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
		Object result=null;
        System.out.println("开始JDK动态代理");
        method.invoke(user, args);
        System.out.println("结束JDK动态代理");
        return result;		
	}
	
	public DynamicProxy(IUserDao user){
        this.user=user;
    }
	
	
}

执行类
public class Run {
	public static void main(String[] args) {
		
		/**
		 *静态代理
		 */
		IUserDao iuser = new UserDaoProxy();
		iuser.get();
		iuser.set();
		
		System.out.println("____________________假装分割线_____________________");
        
        /**
	     * 动态代理
	     */
        UserDao ud=new UserDao();
        DynamicProxy dp=new DynamicProxy(ud);
        
        //生成代理对象
        IUserDao iud=(IUserDao)Proxy.newProxyInstance(ud.getClass().getClassLoader(), ud.getClass().getInterfaces(), dp);
        iud.get();
        iud.set();
	}

}

运行结果:
我是静态代理类,我要加一段执行get方法的日志
我是get方法
我是静态代理类,我要加一段执行set方法的日志
我是set方法
____________________假装分割线_____________________
开始JDK动态代理
我是get方法
结束JDK动态代理
开始JDK动态代理
我是set方法
结束JDK动态代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值