动态代理

需要了解两个类Proxy和InvocationHandler
- Proxy:代理
- InvocationHandler:调用处理程序
Rent:
package com.kakafa.demo01;
//需要被代理的接口
public interface Rent {
    public void rent();
}
Host:
package com.kakafa.demo01;
//房东
public class Host implements Rent{
    @Override
    public void rent() {
        System.out.println("房东要出租房子啦!");
    }
}
ProxyInvocationHandler:
package com.kakafa.demo01;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
    //被代理的接口
    private Rent rent;
    public void setRent(Rent rent){
        this.rent=rent;
    }
    //生成代理对象的方法
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this );
    }
    //处理代理实例,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        seeHouse();
        //动态代理的本质,就是用反射机制实现
        Object result = method.invoke(rent, args);
        fare();
        return result;
    }
    public void seeHouse(){
        System.out.println("看房子");
    }
    public void fare(){
        System.out.println("收费");
    }
}
Client:
package com.kakafa.demo01;
public class Client {
    public static void main(String[] args) {
        //真实角色
        Host host=new Host();
        //代理角色:现在没有
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        pih.setRent(host);
        Rent proxy = (Rent)pih.getProxy();
        proxy.rent();
    }
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号