动态代理概述
代理主要是对对象的行为额外做一些辅助操作。
**@**如何创建代理对象
Java中代理的代表类是:java.lang.reflect.Proxy
Proxy提供了一个静态方法,用于为对象产生一个代理对象返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| package com.proxy1;
public interface skill { void jump(); void sing(); }
package com.proxy1; public class stat implements skill{ private String name; public stat(String name) { this.name = name; } @Override public void jump() { System.out.println("开始跳舞"); } @Override public void sing() { System.out.println("开始唱歌"); } }
package com.proxy1;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;
public class statAgent { public static skill getProxy(stat obj){ return (skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("首付款"); Object rs = method.invoke(obj, args); System.out.println("收尾款"); return rs; } }); } }
package com.proxy1;
public class Test { public static void main(String[] args) { stat s = new stat("杨超越"); skill s2 = statAgent.getProxy(s); s2.jump(); s2.sing(); } }
|
Java****中如何生成代理,并指定代理干什么事
总结:
**1.****代理是什么?**
一个对象,用来对被代理对象的行为额外做一些辅助工作。
**2.****在****Java****中实现动态代理的步骤是什么样的?**
1必须存在接口
2被代理对象需要实现接口
3使用Proxy类提供的方法,方法的代理对象
**3.****通过代理对象调用方法,执行流程是怎么样的?**
1先走向代理
2代理可以为方法额外做一些辅助工作
3开发真正触发对象的方法的执行
4回到代理中,由代理负责返回结果给方法的调用者
优化的关键步骤
1必须有接口,实现类要实现接口(代理通常是基于接口实现的)
2创建一个实现类的对象,该对象为业务对象,紧接着为业务对象做一个代理对象
动态代理的优点:
1 2 3 4
| 1可以在不改变方法源码的情况下,实现对方法功能的增强,提高了代码的复用。 2简化了编程工作、提高了开发效率,同时提高了软件系统的可扩展性。 3可以被代理对象的所有方法做代理。 4非常的灵活,支持任意接口类型的实现类对象做代理,也可以直接为接口本身做代理。
|