为什么需要动态代理技术
- 如果对象身上干的事太多可以通过代理技术转移部分功能
- 对象有什么办法需要被代理,代理就必须要有一定的方法
怎么实现动态代理
创建对象
public class 对象名 implement 接口{private String name;public 对象名(String name){this.name = name;}public String 功能1(){功能实现}public String 功能2(){功能实现} }
创建接口
- 功能:是为了让对象和代理拥有统一的功能
创建代理
- 重写InvocationHandle 中的invoke方法 invoke方法决定着代理要干什么事
- invoke是动态代理中最重要的方法
- 外部调用代理对象的方法
- // 对象 dxProxy = ProxyUtil.createProxy(s);
// dxProxy.功能1("xxx") starProxy.功能2()
public class 代理对象{public static Star createProxy(对象 duixiang){/* newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)参数1:用于指定一个类加载器参数2:指定生成的代理长什么样子,也就是有哪些方法参数3:用来指定生成的代理对象要干什么事情*/获取当前类的类加载器 对象 dxProxy = (对象) Proxy.newProxyInstance(代理对象.getClassLoader(),new Class[]{对象.class}, new InvocationHandler() {@Override // 回调方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 代理对象要做的事情,会在这里写代码if(method.getName().equals("sing")){System.out.println("准备话筒,收钱20万");}else if(method.getName().equals("dance")){System.out.println("准备场地,收钱1000万");}return method.invoke(bigStar, args);}});return dxProxy;} }
实现代理功能
public class Test {public static void main(String[] args) {对象 d = new 对象("超人吉吉");接口 接口Proxy = ProxyUtil.createProxy(d); 创建对象将对象传入代理String rs = 接口Proxy.功能("变身");System.out.println(rs);} }
什么情况下使用动态代理技术
当代码中出现大量重复代码时,我们可以使用动态代理技术将相同的代码放到invoke中去