可以隐藏委托类的实现,实现客户与委托类间的解耦,减少冗余代码。
静态代理与动态代理的区别在于,代理类是否是手动编写的;动态代理有JDK动态代理和Cglib动态代理,后者针对没有接口的类。
静态代理
public interface House {
void buy();
}
public class HouseImpl implements House {
@Override
public void buy() {
System.out.println("buy house");
}
}
public class HouseProxy implements House {
private House house;
public HouseProxy(House house) {
this.house = house;
}
@Override
public void buy() {
System.out.println("start"); // 代理方法的关键处理
house.buy();
System.out.println("end"); // 代理方法的关键处理
}
}
@Test
public void proxyTest() {
HouseProxy houseProxy = new HouseProxy(new HouseImpl());
houseProxy.buy();
}
JDK动态代理
public class DynamicProxyHandler implements InvocationHandler {
private Object object;
public DynamicProxyHandler(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start");
Object invoke = method.invoke(object, args);
System.out.println("end");
return invoke;
}
}
@Test
public void DynamicProxyTest() {
House house = (House) Proxy.newProxyInstance(House.class.getClassLoader(), new Class[]{House.class}, new
DynamicProxyHandler(new HouseImpl()));
house.buy();
}
Cglib动态代理
public class Car {
public void buy() {
System.out.println("buy car");
}
}
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer;
public CglibProxy() {
this.enhancer = new Enhancer();
}
public Object getInstance(Class cls) {
enhancer.setSuperclass(cls);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("start");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("end");
return result;
}
}
@Test
public void CglibProxyTest() {
CglibProxy cglibProxy = new CglibProxy();
Car car = (Car) cglibProxy.getInstance(Car.class);
car.buy();
}