一文读懂JDK动态代理,彻底不忘

大家是不是每次读完动态代理原理,感觉好像懂了,然后过一段时间又忘了?
那是真的懂了吗?相信自己,读了这篇文章,让你永远不会忘记jdk的动态代理是如何实现的。
1接口

public interface PayService {
	public String pay(double count);
}

2接口实现类

public class PayServiceImpl implements PayService{
	public String pay(double count){
		System.out.println("支付金额" + count);
		return "支付了:"+count;
	}
}

3实现了jdk自带的handller

public class MyHandler implements InvocationHandler{
	
	private PayService payService;
	

	public MyHandler(PayService payService) {
		super();
		this.payService = payService;
	}


	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object object  = method.invoke(payService, args);
		return object;
	}

}

private PayService payService;
首先,需要将被代理的类payService注入进来,可以通过构造方法或者set方法---------------如果不注入进来,你怎么代理他呢
其次,重写invoke方法
1、proxy是生成的代理类-----各位可以打断点看
2、method是方法名,args是方法参数
3、Object object = method.invoke(payService, args);这句就是关键代码
通过反射调用payService的method方法,参数为args,
object为返回值,如果没有返回值,可以返回null

生成的动态代理类,调用方法的时候,就会进入invoke方法

4测试类

public class Test {
	public static void main(String[] args) {
		//创建被代理类
		PayService payService = new PayServiceImpl();
		//生成动态代理类,固定写法。参数1,类加载器,2被代理类的实现接口,3实现jdk接口的处理类
		PayService object =(PayService) Proxy.newProxyInstance(Test.class.getClassLoader(), 
				payService.getClass().getInterfaces(), new MyHandler(payService));
		//object会调用MyHandler的invoke方法
		String count = object.pay(10.24);
		System.out.println("end"+count);
	}
}

解释完毕,大家自己想一下,自己写一下。

你可能感兴趣的:(设计模式)