码迷,mamicode.com
首页 > 其他好文 > 详细

动态代理

时间:2018-12-27 11:20:33      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:out   else   vat   ble   null   set   static   public   des   

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();

    }

}

 

 

也可以使用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();

    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

动态代理

标签:out   else   vat   ble   null   set   static   public   des   

原文地址:https://www.cnblogs.com/chenglc/p/10183657.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!