动态代理总结

1.什么叫做代理

代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问。
代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。

看不懂有没有, 没关系, 现在可以简单的把代理理解成中介, 就像房产中介, 你租房子可以直接找房东, 但是你找不到房东, 那怎么办? 找中介, 找中介和找房东的效果一样, 但是中介可能会控制你一下, 或者约束你一下, 或者多要你的钱, 但是你最后还是可以达到你的目的, 那就是租到房子. 这个代理就是中介, 他会在你的目的方法之前或者之后做一些事情, 但是最终还是会让你调用到你的目的方法.


2.动态代理和静态代理的简单区别

静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理类:在程序运行时,运用反射机制动态创建而成。


3.为什么要使用代理? 为什么要使用动态代理?

代理可以在不更改(得不到)源代码的情况下对源代码进行功能增强. 

动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。


4.如何实现动态代理

		//对Collection接口做一个代理, 通过Proxy.newProxyInstance()的静态方法来搞定. 该方法较复杂, 需要传递一个InvocationHandler.
		Collection c = (Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(), 	//首先传递一个ClassLoader, 一般使用被代理的类的默认loader
															new Class[]{Collection.class}, 	//然后传递为该代理指定的接口.
															new InvocationHandler(){		//最后传递一个InvocationHandler, 覆盖invoke方法, 
			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				ArrayList al = new ArrayList();	//指定一个目标
				// TODO Auto-generated method stub
				System.out.println("即将调用"+method);	//在重写的invoke方法中, 随意做一些你喜欢的事情.
				Object obj = method.invoke(al, args);	//然后调用被代理类的原方法, 并赋值给obj
				System.out.println("调用"+method+"结束...");
				return obj;	//最后return该obj, 一切搞定.
			}});
		
		c.add("111"); //调用c的add方法时会看到那2个System方法被执行了


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值