在很长的一段时间里,我对JDK动态代理的感知都比较模糊,每当要用的到的时候就不清楚代码怎么写,然后就只能网上找代码示例,Ctrl+c/Ctrl+v,最后又忘记了。其次每次找的都有点浪费时间,不是要关注就是要订阅,略显麻烦,所以这次就自己写一个加强记忆,也方便查找。
一、代码示例
要使用JDK动态代理,唯一麻烦的就是至少要3个类(或者是接口),不包含调用者:
1. 业务接口,示例中的 Worker 接口;
2. 业务接口实现类,示例中的 HouseLessWorker 类;
3. InvocationHandler 接口实现类,其实这个类的目的就是增强对业务接口的实现,示例中的 EstateAgent 类;
4. 调用者,示例中的 ProxyTest 类。
Worker 代码:
package org.example.proxy;
public interface Worker {
void rentHouse();
}
HouseLessWorker 代码:
package org.example.proxy;
public class HouseLessWorker implements Worker {
@Override
public void rentHouse() {
System.out.println("Want to rent a single room of about 5 square meters");
}
}
EstateAgent 代码:
package org.example.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class EstateAgent implements InvocationHandler {
private final Worker worker;
public EstateAgent(Worker worker) {
this.worker = worker;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("The worker's salary is small");