代理模式之JDK动态代理
1:动态代理概念
相比于静态代理,动态代理在创建代理对象上更加的灵活 ,通过反射机制在程序运行期,动态的为目标对象创建代理对象,代理的行为可以代理多个方法,即满足生产需要的同时又达到代码通用的目的
概念什么的放一边去吧,下面上代码
2:动态代理特点
JDK动态代理的目标对象必须有接口实现
2.1. 目标对象不固定 2.2. 在应用程序执行时动态创建目标对象 2.3. 代理对象会增强目标对象的行为
3:代码实现
3.1:编写接口,定义目标对象的父类接口
/*** 定义行为 */ public interface Marry { public void toMarry(); }
3.2:定义目标对象类,实现接口
/*** 代理 ——> 目标对象 */ public class You implements Marry{ @Override public void toMarry() { System.out.println("我要结婚了"); } }
3.3:定义代理类,实现接口
Proxy类是专门完成代理的操作类
public class JDKHandler implements InvocationHandler { // 目标对象 private Object target; // 目标对象的类型不固定,创建时动态生成 // 通过构造器将目标对象赋值 public JDKHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 增强行为 System.out.println("==============方法前执行"); // 调用目标对象的方法(返回Object) Object result = method.invoke(target,args); // 增强行为 System.out.println("方法后执行=============="); return result; } // 调用此方法获取代理 public Object getProxy() { return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } }
3.4:代码测试
public class Test { public static void main(String[] args) { // 目标对象 You you = new You(); // 获取代理对象 JDKHandler jdkHandler = new JDKHandler(you); Marry marry = (Marry) jdkHandler.getProxy(); // 通过代理对象调用目标对象中的方法 marry.toMarry(); } }