动态代理
为了解决静态代理,代码膨胀问题。
原理
通过反射实现。
实现
ProxyInvocationHandler 实现 InvocationHandler接口
Rentable.java
public interface Rentable {
void rent();
}
Host.java
public class Host implements Rentable{
@Override
public void rent() {
System.out.println("房东:我要出租房子");
}
}
ProxyInvocationHandler.java
public class ProxyInvocationHandler implements InvocationHandler {
/**
* 被代理的接口
*/
private Object obj;
private void before(){
System.out.println("before....");
}
private void after(){
System.out.println("after....");
}
public void setObj(Object obj) {
this.obj = obj;
}
public<T> T getObjProxy(Class<T> t){
return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object invoke = method.invoke(obj, args);
after();
return invoke;
}
}
DynamicProxyTest.java
public class DynamicProxyTest {
@Test
public void test(){
// 创建被代理对象
Host host = new Host();
// 创建代理
ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();
// 设置代理对象
proxyInvocationHandler.setObj(host);
// 获取代理对象
Rentable objProxy =proxyInvocationHandler.getObjProxy(Rentable.class);
objProxy.rent();
}
}
before....
房东:我要出租房子
after....
优点
- 不会代码膨胀