java的静态代理和2种动态代理(未完,待续)


package
com.liubingfei.test.proxy.staticproxy; /** * @author LiuBingFei * @desc 接口,定义抽象方法:卖房子,出租房子。 * @date 2020/3/5 22:09 * @return */ public interface house { //卖房子 public abstract void sell_house(); //出租房子 public abstract void rental_house(); }

 

package com.liubingfei.test.proxy.staticproxy;

/**
 * @author LiuBingFei
 * @desc
 * @date 2020/3/5 22:12
 * @return
 */
public class house_owner implements house{
    @Override
    public void sell_house() {
        System.out.println("房主卖房子");
    }

    @Override
    public void rental_house() {
        System.out.println("房主出租房子");
    }
}

 

package com.liubingfei.test.proxy.staticproxy;

/**
 * @author LiuBingFei
 * @desc
 * @date 2020/3/5 22:14
 * @return
 */
public class house_proxy implements house {
    //房主
    private house_owner owner;

    public house_proxy(house_owner owner) {
        this.owner = owner;
    }

    @Override
    //调用房主卖房子
    public void sell_house() {
        owner.sell_house();
    }

    @Override
    //调用房主出租房子
    public void rental_house() {
        owner.rental_house();
    }
}

 

package com.liubingfei.test.proxy.staticproxy;

import org.junit.Test;

/**
 * @author LiuBingFei
 * @desc
 * @date 2020/3/5 22:19
 * @return
 */
public class static_proxy {
    @Test
    //静态代理:房产中介house_proxy代理房主house_owner卖房子
    //静态代理:代理类和被代理类,实现同样的接口或者继承同样的父类。在程序运行前就编译好,叫做静态代理。
    public void proxy() {
        house_proxy proxy = new house_proxy(new house_owner());
        proxy.sell_house();
        proxy.rental_house();
    }
}

 

 

 

 

 

 

package com.liubingfei.test.proxy.dynamicproxy.jdk_proxy;

/**
 * @author LiuBingFei
 * @desc 接口,定义抽象方法:卖房子,出租房子。
 * @date 2020/3/5 22:09
 * @return
 */
public interface House {
    //卖房子
    public abstract void sell_house();
    //出租房子
    public abstract void rental_house();
}

 

package com.liubingfei.test.proxy.dynamicproxy.jdk_proxy;

/**
 * @author LiuBingFei
 * @desc
 * @date 2020/3/5 22:12
 * @return
 */
public class House_owner implements House{
    @Override
    public void sell_house() {
        System.out.println("房主卖房子");
    }

    @Override
    public void rental_house() {
        System.out.println("房主出租房子");
    }
}

 

package com.liubingfei.test.proxy.dynamicproxy.jdk_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author LiuBingFei
 * @desc
 * @date 2020/3/5 22:48
 * @return
 */
public class House_proxy implements InvocationHandler {
    private House house;

    public House_proxy(House house) {
        this.house = house;
    }

    /**
     * Proxy.newProxyInstance(param1, param2, param3)
     * param1: ClassLoader对象;
     * param2: 被代理类的接口数组,因为代理底层要根据接口生成;
     * param3:参数类型是InvocationHandler即可,this即是当前类,它实现了这个接口。
     * @return 返回一个代理类
     */
    public Object getProxy(){
        Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{House.class}, this);
        return proxy;
    }

    /**
     *
     * @param proxy 代理对象,就是房产中介
     * @param method 代理对象中的方法
     * @param args 代理对象中的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object invoke = method.invoke(house, args);
        System.out.println("中介收取中介费");
        return invoke;
    }
}

 

package com.liubingfei.test.proxy.dynamicproxy.jdk_proxy;

import org.junit.Test;

/**
 * @author LiuBingFei
 * @desc
 * @date 2020/3/5 23:14
 * @return
 */
public class Jdk_proxy {
    @Test
    public void proxy() {
        //传入被代理类,创建动态代理类的对象。
        House_proxy house_proxy = new House_proxy(new House_owner());
        //获得代理类,强转成接口类型。
        House house = (House) house_proxy.getProxy();
        //使用多态的向下造型
        house.sell_house();
        house.rental_house();
    }
}

 

posted @ 2020-03-05 23:58  北极star  阅读(177)  评论(0编辑  收藏  举报