接口类
Rent
public interface Rent {
public void rent();
}
实现接口
Host
public class Host implements Rent {
@Override
public void rent() {
System.out.println("房子");
}
}
动态生成代理
ProxyInvocationHandler
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);
}
//处理代理实例
// method 是接口的方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(rent, args);
return invoke;
}
}
测试
public static void main(String[] args) {
//真实角色
Host host = new Host();
// 代理角色,现在还没有
ProxyInvocationHandler pih = new ProxyInvocationHandler();
// 将真实角色传递给代理角色(相当于看中这套房,告诉中介,让中介找对应的房东)
pih.setTarget(host);
// 动态代理生成实例 【proxy】动态生成
Rent proxy = (Rent) pih.getProxy();
// 调用动态代理生成的那个方法(虽然和接口是一个方法,但是已经由动态代理重新代理了)
proxy.rent();
}
结果: