为什么需要动态代理技术
- 如果对象身上干的事太多可以通过代理技术转移部分功能
- 对象有什么办法需要被代理,代理就必须要有一定的方法
怎么实现动态代理
创建对象
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中去