静态代理,动态代理,java代码实现

1. 静态代理模式:

package proxy;

/**
 * room工厂
 * roomSize:房子的大小
 * roomPrice:房子的价格
 */
interface RoomFactory{
    void roomSize();
    void roomPrice();
}

/**
 * 被代理类,人要买房子
 */
class PersonRoom implements RoomFactory{

    @Override
    public void roomSize() {
        System.out.println("我想要150平米");

    }
    @Override
    public void roomPrice() {
        System.out.println("我期望的价格是150万");
    }
}

class AgentRoom implements RoomFactory{

    private RoomFactory personroom;
    //用被代理类对象进行实例化
    public AgentRoom(RoomFactory personroom){
        this.personroom=personroom;
    }
    @Override
    public void roomSize() {
        System.out.println("所有房子最小为:100");
        personroom.roomSize();
        System.out.println("所有房子最大为:200");
    }

    @Override
    public void roomPrice() {
        System.out.println("所有房子最便宜为:100万");
        personroom.roomPrice();
        System.out.println("所有房子最贵为:500万");
    }
}

public abstract class staticProxyTest{
    public static void main(String[] args) {
        PersonRoom personRoom = new PersonRoom();
        AgentRoom agentRoom = new AgentRoom(personRoom);
        agentRoom.roomSize();
        System.out.println();
        agentRoom.roomPrice();
    }

}

运行结果

proxy.staticProxyTest
所有房子最小为:100
我想要150平米
所有房子最大为:200

所有房子最便宜为:100万
我期望的价格是150万
所有房子最贵为:500万

Process finished with exit code 0

2. 动态代理模式:

package proxy;

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

interface Human{
    String getBelief();
    void eat(String food);
}

/**
 * 被代理类
 */
class superman implements Human{

    @Override
    public String getBelief() {
        return "我要拯救世界";
    }

    @Override
    public void eat(String food) {
        System.out.println("我爱吃"+food);
    }
}

/**
 * 要想实现动态代理,需要解决的问题:
 * 1、如何根据被加载到内存的被代理类,动态创建一个代理类及其对象
 * 2、当通过代理类的对象调用方法时,如何动态的去调用被代理类的同名方法
 */
//这里没有代理类对象,而是根据被代理类对象动态生成代理类对象
class proxyFactory{
    //调用此方法创建代理类的对象,解决问题一
    public static Object getproxyInstance(Object obj){//obj:被代理类的对象
        MyInvocationHandler handler=new MyInvocationHandler();
        handler.band(obj);
        /**
         * 返回和被代理类相同的加载器,接口,同名方法的代理类对象
         */
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
    }
}
class  MyInvocationHandler implements InvocationHandler{
    //需要使用被代理类的对象进行对obj赋值
    private Object obj;
    public void band(Object obj){
        this.obj=obj;
    }
    //当我们通过代理类的对象,调用被代理类的a方法时,就会自动调用如下方法invoke()
    //被代理类要执行的方法a的功能就声明在invoke中
   @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //method:即为代理类对象调用的方法,此方法也就作为被代理类要调用的方法
        //obj:被代理类的对象
        Object methodValue = method.invoke(obj,args);
        return methodValue;
    }
}
public class dynamicProxyTest{
    public static void main(String[] args) {
        superman superman = new superman();
        //编译的时候动态生成代理类对象
        Human factoryInstance = (Human) proxyFactory.getproxyInstance(superman);
        //当调用代理类对象方法时,会自动调用被代理类中的同名方法
        String str=factoryInstance.getBelief();
        System.out.println(str);
        factoryInstance.eat("面包");
        System.out.println("******************************");
        PersonRoom personRoom = new PersonRoom();
        //编译的时候动态生成代理类对象
        RoomFactory roomInstance = (RoomFactory) proxyFactory.getproxyInstance(personRoom);
        roomInstance.roomSize();
        roomInstance.roomPrice();
    }

}

运行结果

proxy.dynamicProxyTest
我要拯救世界
我爱吃面包
******************************
我想要150平米
我期望的价格是150万

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值