黑马程序员技术交流社区
标题: 急---动态代理问题! [打印本页]
作者: 王林涛 时间: 2013-8-7 08:51
标题: 急---动态代理问题!
本帖最后由 王林涛 于 2013-9-23 21:20 编辑
动态代理有哪些应用?
如果要给举例子,请说明该例子是用来做什么的!
在下拜谢了!
作者: 哪颗最亮的星星 时间: 2013-8-7 10:52
就现在学习的代理,我觉得它就是解决AOP(面向方面的编程),也就是在InvocationHandle接口下的invoke()中添加了一些系统方法(日志、安全、事务)。
作者: 王林涛 时间: 2013-8-7 11:24
亲,你说的那是代理,而不是动态代理
作者: 黑马龙子 时间: 2013-8-7 11:24
标题: //抽象角色:java动态代理的实现目前只支持接口,不支持...
本帖最后由 黑马龙子 于 2013-8-7 11:29 编辑
所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。 生活中的例子:过年加班比较忙,没空去买火车票,这时可以打个电话到附近的票务中心,叫他们帮你买张回家的火车票,当然这会附加额外的劳务费。但要清楚票务中心自己并不卖票,只有火车站才真正卖票,票务中心卖给你的票其实是通过火车站实现的。这点很重要!打电话的就是“客户”,票务中心就是“代理角色”,火车站是“真实角色”,卖票称为“抽象角色”!附加例子:希望对你有所帮助!
- //抽象角色:java动态代理的实现目前只支持接口,不支持抽象类
- interface BusinessFoo
- {
- void foo();
- }
- interface BusinessBar
- {
- String bar(String message);
- }
- //真实角色:真正实现业务逻辑方法
- class BusinessFooImpl implements BusinessFoo
- {
- public void foo()
- {
- System.out.println("BusinessFooImpl.foo()");
- }
- }
- class BusinessBarImpl implements BusinessBar
- {
- public String bar(String message)
- {
- System.out.println("BusinessBarImpl.bar()");
- return message;
- }
- }
- //动态角色:动态生成代理类
- class BusinessImplProxy implements InvocationHandler
- {
- private Object obj;
- BusinessImplProxy() {
- }
- BusinessImplProxy(Object obj) {
- this.obj = obj;
- }
- public Object invoke(Object proxy,Method method,Object[] args) throws Throwable
- {
- Object result = null;
- doBefore();
- result = method.invoke(obj,args);
- doAfter();
- return result;
- }
- public void doBefore(){
- System.out.println("do something before Business Logic");
- }
- public void doAfter(){
- System.out.println("do something after Business Logic");
- }
- public static Object factory(Object obj)
- {
- Class cls = obj.getClass();
- return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new BusinessImplProxy(obj));
- }
- }
- //测试类
- public class DynamicProxy
- {
- public static void main(String[] args) throws Throwable
- {
- BusinessFooImpl bfoo = new BusinessFooImpl();
- BusinessFoo bf = (BusinessFoo)BusinessImplProxy.factory(bfoo);
- bf.foo();
- System.out.println();
-
- BusinessBarImpl bbar = new BusinessBarImpl();
- BusinessBar bb = (BusinessBar)BusinessImplProxy.factory(bbar);
- String message = bb.bar("Hello,World");
- System.out.println(message);
- }
- }
复制代码
程序流程说明: new BusinessFooImpl();创建一个“真实角色”,传递给工厂方法BusinessImplProxy.factory(),进而初始化“调用处理器”——即实现InvocationHandler的类。并返回一个动态创建的代理类实例,由于“代理角色”也必然实现了“抽象角色”提供的业务逻辑方法,故可向下转型为BusinessBar,并赋值给指向BusinessBar类型的引用bb。 newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法由自己来指定参数动态返回需要的代理类,而invoke(Object proxy, Method method, Object[] args) 方法则是由JVM在运行时动态调用的。当执行“bb.bar("Hello,World");”方法时,JVM动态指派“调用处理器”,向外层invoke传递参数,并调用method.invoke(obj,args)真正执行!BusinessImplProxy.Factory静态方法用来动态生成代理类(“代理角色”),在运行时根据不同的业务逻辑接口BusinessFoo和BusinessBar,在运行时分别动态生成了代理角色。“抽象角色”、“代理角色”以及调用处理器(实现InvocationHandler接口的类)这三者可以改变。
作者: Household 时间: 2013-9-20 22:19
你先学习,后面我学到,请你指教一下!!
作者: Household 时间: 2013-9-20 22:20
你先学习,后面我学到,请你指教一下!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |