动态代理(下)

动态代理作用

最终是学习AOP(面向切面编程),它与装饰者模式有点相似,它比装饰者模式还要灵活!


InvocationHandler

public Object invoke(Object proxy, Method method, Object[] args);

这个invoke()方法在什么时候被调用!

  1. 在代理对象被创建时?错误的!
  2. 在调用代理对象所实现接口中的方法时?正确的!
  • Object proxy:当前对象,即代理对象!在调用谁的方法!
  • Method method:当前被调用的方法(目标方法)
  • Object[] args:实参!

调用处理器-InvocationHandler图解

在这里插入图片描述

动态代理图解

在这里插入图片描述
目标对象:被增强的对象
代理对象:需要目标对象,然后在目标对象上添加了增强后的对象!
目标方法:增强的内容

代理对象 = 目标对象 + 增强

动态代理之Waiter案例

Waiter.java

package cn.itcast.demo2;

//服务员
public interface Waiter {
	//只会服务
	public void serve();
}

ManWaiter.java

package cn.itcast.demo2;
/**
 * 男服务员
 * @author WenHuagang
 *
 */
public class ManWaiter implements Waiter {
	public void serve() {
		System.out.println("服务中...");
	}
}

测试

package cn.itcast.demo2;

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

import org.junit.Test;
/**
 * 动态代理之Waiter案例
 * @author WenHuagang
 *
 */
public class Demo1 {
	
	@Test
	public void fun1() {
		/*
		 * 给出三大参数,调用Proxy.newProxyInstance(ClassLoader loader,Class[] interfaces, InvocationHandler h)
		 * 得到代理对象
		 */
		Waiter manWaiter = new ManWaiter();//manWaiter目标对象
		
		ClassLoader loader = this.getClass().getClassLoader();
		Class[] interfaces = {Waiter.class};
		InvocationHandler h = new WaiterInvocationHandler(manWaiter);//传递目标对象
		
		//得到代理对象,代理对象就是在目标对象到额基础上进行了增强后的对象!!!
		Waiter waiterProxy = (Waiter)Proxy.newProxyInstance(loader, interfaces, h);
		waiterProxy.serve();//前面添加"你好",后面添加"再见"
	}

}

class WaiterInvocationHandler implements InvocationHandler {
	private Waiter waiter;//目标对象
	
	public WaiterInvocationHandler(Waiter waiter) {//传递调用处理时传递:目标对象
		this.waiter = waiter;
	}
	
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("你好!");//增强的内容!
		waiter.serve();//调用目标对象的方法
		System.out.println("再见!");//增强的内容!
		
		return null;
	}
	
}

结果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值