动态代理
dunamic proxy
动态代理模式相比静态代理,不需要自己写代理类
jdk可以实现动态代理
操作如下:
公共接口:
/** * ClassName: House<br/> * Description: 房子<br/> * date: 2018/12/26 11:08 AM<br/> * * @author chengluchao * @since JDK 1.8 */ public interface House { /** * 地址 */ void address(); /** * 房租 */ void rent(); /*** * 租期 */ void leaseTerm(); /** * 房东 */ void landlord(); }
真实角色:
/** * ClassName: RealHouse<br/> * Description: 房东<br/> * date: 2018/12/26 11:14 AM<br/> * * @author chengluchao * @since JDK 1.8 */ public class RealHouse implements House { @Override public void address() { System.out.println("北京市-东城区-长安街-1号院-1号楼-1单元-101"); } @Override public void rent() { System.out.println("3000/月"); } @Override public void leaseTerm() { System.out.println("2年"); } @Override public void landlord() { System.out.println("王大户"); } }
实现接口:
/** * ClassName: HouseHandler<br/> * Description: <br/> * date: 2018/12/27 10:25 AM<br/> * * @author chengluchao * @since JDK 1.8 */ public class HouseHandler<T> implements InvocationHandler { private T t; public HouseHandler(T t) { this.t = t; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("真实操作前的操作"); if (method.getName().equals("rent")) System.out.println("9000"); else method.invoke(t, args); return null; } }
测试类:
/** * ClassName: HouseTest<br/> * Description:测试类 <br/> * date: 2018/12/26 11:21 AM<br/> * * @author chengluchao * @since JDK 1.8 */ public class HouseTest { public static void main(String[] args) { House real = new RealHouse(); HouseHandler handler = new HouseHandler(real); House proxy = (House) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{House.class}, handler); proxy.address(); proxy.landlord(); proxy.leaseTerm(); proxy.rent(); } }
真实操作前的操作
北京市-东城区-长安街-1号院-1号楼-1单元-101
真实操作前的操作
王大户
真实操作前的操作
2年
真实操作前的操作
9000
也可以使用lambad表达式,不需要写接口的实现类,直接在测试方法中调用:
static void lamdTest() { House proxy = (House) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{House.class}, (object, method, args) -> { System.out.println("lamdTest-真实操作前的操作"); if (method.getName().equals("rent")) System.out.println("9000"); else method.invoke(new RealHouse(), args); return null; }); proxy.address(); proxy.landlord(); proxy.leaseTerm(); proxy.rent(); }
lamdTest-真实操作前的操作
北京市-东城区-长安街-1号院-1号楼-1单元-101
lamdTest-真实操作前的操作
王大户
lamdTest-真实操作前的操作
2年
lamdTest-真实操作前的操作
9000