代理模式
静态代理
代理类只能够为特定的类产生代理对象,不能代理任意类 静态代理只能代理实现通用接口的类
动态代理
JDK动态代理
特点是被代理对象一定实现了某个接口,因为JDK动态代理是基于接口创建的代理对象
public class JDKDynamicProxy implements InvocationHandler {
private Object obj;
public JDKDynamicProxy ( Object obj) {
this . obj = obj;
}
public Object getProxy ( ) {
ClassLoader classLoader = obj. getClass ( ) . getClassLoader ( ) ;
Class < ? > [ ] interfaces = obj. getClass ( ) . getInterfaces ( ) ;
Object proxy = Proxy . newProxyInstance ( classLoader, interfaces, this ) ;
return proxy;
}
@Override
public Object invoke ( Object proxy, Method method, Object [ ] args) throws Throwable {
Object result = method. invoke ( obj, args) ;
return result;
}
}
public interface Rent {
void rent ( ) ;
}
public class Host implements Rent {
private String name;
private String address;
public Host ( ) {
}
public Host ( String name, String address) {
this . name = name;
this . address = address;
}
@Override
public void rent ( ) {
System . out. println ( name + "出租的位置是:" + address) ;
}
}
public static void main ( String [ ] args) {
Host host = new Host ( "张三" , "北京" ) ;
Rent proxy = ( Rent ) new JDKDynamicProxy ( host) . getProxy ( ) ;
proxy. rent ( ) ;
}
CGLib动态代理
被代理类可以不用实现接口,通过被代理类的子类创建代理对象 需要添加CGLib依赖
< dependency>
< groupId> cglib</ groupId>
< artifactId> cglib</ artifactId>
< version> 3.3.0</ version>
</ dependency>
public class CGLibDynamicProxy implements MethodInterceptor {
private Object obj;
public CGLibDynamicProxy ( Object obj) {
this . obj = obj;
}
public Object getProxy ( ) {
Enhancer enhancer = new Enhancer ( ) ;
enhancer. setSuperclass ( obj. getClass ( ) ) ;
enhancer. setCallback ( this ) ;
Object proxy = enhancer. create ( ) ;
return proxy;
}
@Override
public Object intercept ( Object o, Method method, Object [ ] objects, MethodProxy methodProxy) throws Throwable {
Object result = method. invoke ( obj, objects) ;
return result;
}
}
public class Host {
private String name;
private String address;
public Host ( ) {
}
public Host ( String name, String address) {
this . name = name;
this . address = address;
}
public void rent ( ) {
System . out. println ( name + "出租的位置是:" + address) ;
}
}
public static void main ( String [ ] args) {
Host host = new Host ( "李四" , "上海" ) ;
Host proxy = ( Host ) new CGLibDynamicProxy ( host) . getProxy ( ) ;
proxy. rent ( ) ;
}