package cn.hncu.proxy.rent;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
final Renter r = new Renter(); //被代理对象---原型对象
Object newObj = Proxy.newProxyInstance(
Client.class.getClassLoader(),
new Class[]{IRenter.class},
new InvocationHandler() {
@Override //参数: proxy是代理后的对象(和外面的newObj是一样的) , method是当前被调用的Method对象, args是当前Method对象的参数
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//System.out.println("进来来....."+ method.getName());
if(method.getName().equals("rent")){
System.out.println("给中介交点费用吧...");
//System.out.println("你可以走了...");
return method.invoke(r, args);
}
Object res = method.invoke(r, args); //放行,,用原型对象去执行
return res;
}
});
//代理后的对象newObj 是和 原型对象r 不同类型的对象。 两者属于兄弟关系,都是IRenter接口的实现类(子类)
//因此下面的方式是错误的,兄弟类之间是无法强转
//Renter obj2 = (Renter) newObj;
//obj2.rent();
//代理后的对象newObj通常都是强转成 接口类型来调用的
IRenter ir = (IRenter) newObj;
ir.rent();
String str = ir.toString();
System.out.println(str);
}
}
----------------------------------------------------------------------------------------------------------------
package cn.hncu.proxy.rent;
//源对象和代理后的对象的 类型 ---封装隔离
public interface IRenter {
public void rent();
}
-----------------------------------------------------------------------------------------------------------------
package cn.hncu.proxy.rent;
//房东: 被代理对象
public class Renter implements IRenter{
public void rent(){
System.out.println("房东:提供房子,收房租....");
}
@Override
public String toString() {
return "不要破坏我的房子....";
}
}