博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态代理
阅读量:2387 次
发布时间:2019-05-10

本文共 2748 字,大约阅读时间需要 9 分钟。

dunamic proxy
 
动态代理模式相比静态代理,不需要自己写代理类
jdk可以实现动态代理
操作如下:
 
公共接口:
/** * ClassName: House
* Description: 房子
* date: 2018/12/26 11:08 AM
* * @author chengluchao * @since JDK 1.8 */public interface House { /** * 地址 */ void address(); /** * 房租 */ void rent(); /*** * 租期 */ void leaseTerm(); /** * 房东 */ void landlord();}

真实角色:

/** * ClassName: RealHouse
* Description: 房东
* date: 2018/12/26 11:14 AM
* * @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
* Description:
* date: 2018/12/27 10:25 AM
* * @author chengluchao * @since JDK 1.8 */public class HouseHandler
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
* Description:测试类
* date: 2018/12/26 11:21 AM
* * @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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @
2018-12-27 10:42 阅读(
...) 评论(
...)

转载地址:http://fzjab.baihongyu.com/

你可能感兴趣的文章
DNS Security Tips
查看>>
2017 linkedin中国人才报告
查看>>
技术相关记录
查看>>
RSA 2017 USA 笔记
查看>>
信息系统审计书籍
查看>>
Invision Power Board Multiple SQL Injection Vulnerabilities
查看>>
符号执行
查看>>
Remote Installation Service (RIS) in Windows Server 2003
查看>>
Nginx Security Law
查看>>
Kerberos 协议
查看>>
Watch Your WHOIS Entries
查看>>
Using the Metasploit PHP Remote File Include Module
查看>>
Metasploit jboss deployment file repository exploit
查看>>
Layer Four Traceroute
查看>>
Hardening guide for Apache 2.2.15 on RedHat 5.4 (64bit edition)
查看>>
Microsoft Outlook Web Access (OWA) version 8.2.254.0 information disclosure vulnerability
查看>>
STP mitm attack idea
查看>>
Month of PHP Security - Summary
查看>>
近期将要购买的图书
查看>>
nginx Directory Traversal Vulnerability
查看>>