Java JDK动态代理实例

2020-08-07  本文已影响0人  在error边缘疯狂试探

房屋出租的接口

package 动态代理;
//租房接口
public interface Rent {
    public void rent();
}

房东实现出租的方法

package 动态代理;
// 房东进行租房
public class Host  implements Rent
{
    @Override
    public void rent() {
        System.out.println("房东开始出租房子啦!");
    }
}

设置调用处理器,实现InvocaHandler 接口

package 动态代理;

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

// 我的程序调用处理器,通过实现InvocationHandler 编程一个处理器,再通过Proxy 代理类的newProxyInstance()方法 获得 形成的代理对象
public class MyInvocationHandler implements InvocationHandler {
//    将被代理的接口对象引入
    private Rent rent;

//    private Object object;
//
//    public void setObject(Object object) {
//        this.object = object;
//    }

    public void setRent(Rent rent) {
        this.rent = rent;
    }

    public Object getProxyClass(){
//        return Proxy.newProxyInstance(this.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);

    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        seeHouse();
        method.invoke(rent,args);
//        method.invoke(object,args);
        fare();
        return null;
    }
//  这里的方法应该是被代理类所需要的通用的方法,比如日志、事务等。。。
    public void seeHouse(){
        System.out.println("中介带你看房!!");
    }
    public void fare(){
        System.out.println("向中介付钱!!");
    }

}

客户端调用

package 动态代理;

public class Client {

    public static void main(String[] args) {
//        创建出要被代理的角色
        Host host = new Host();
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
//        将被代理的角色放入调用处理器中
        myInvocationHandler.setRent(host);
        Rent proxyClass = (Rent) myInvocationHandler.getProxyClass();
        proxyClass.rent();

    }
}

上一篇下一篇

猜你喜欢

热点阅读