// 定义一个接口
public interface Rental {
public void sale();
}
// 委托类 实现接口方法
public class Entrust implements Rental{
@Override
public void sale() {
System.out.println("出租房子");
}
}
// 代理类
public class AgentRental implements Rental{
private Rental target; // 被代理对象
public AgentRental(Rental target) {
this.target = target;
}
@Override
public void sale() {
System.out.println("房子出租价位有1k-3k"); // 增加新的操作
target.sale(); // 调用Entrust委托类的sale方法
}
}
public static void main(String[] args) {
Entrust entrust = new Entrust();
AgentRental agentRental = new AgentRental(entrust);
agentRental.sale();
}
// 代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TestAgent implements InvocationHandler {
// target变量为委托类对象
private Object target;
public TestAgent(Object target) {
this.target = target;
}
// 实现 java.lang.reflect.InvocationHandler.invoke()方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 添加自定义的委托逻辑
System.out.println("房子出租价位有1k-3k");
// 调用委托类的方法(java底层封装好了)
method.invoke(target,args);
}
}
// 测试类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class test {
public static void main(String[] args) {
// 获取委托类的实例对象
Entrust testEntrust = new Entrust();
// 获取委托类的CLassLoader
ClassLoader classLoader = testEntrust.getClass().getClassLoader();
// 获取委托类的所有接口
Class[] interfaces = testEntrust.getClass().getInterfaces();
// 获取一个调用处理器
InvocationHandler invocationHandler = new TestAgent(testEntrust);
// 查看生成的代理类
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
// 创建代理对象
Rental proxy = (Rental) Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
// 调用代理对象的sale()方法
proxy.sale();
}
}
目的调用 B.f 入口类 A 接收参数O A中有O.method 但method没有可利用的 若O是动态代理类,且O接收参数B、invoke方法中含有 B.f 则执行O.method时会自动执行 B.f