1 静态代理
接口
public interface ZuFANG {
public void zuFANG();
}
具体实现类
public class FangDong implements ZuFANG{
@Override
public void zuFANG() {
System.out.println("我是房东");
}
}
代理类
public class ZhongjieProxy implements ZuFANG{
private FangDong fangdong;
public ZhongjieProxy(FangDong fangdong) {
this.fangdong = fangdong;
}
@Override
public void zuFANG() {
System.out.println("代理租房开始");
fangdong.zuFANG();
System.out.println("代理租房结束");
}
}
测试类
public class ProxyTest {
public static void main(String[] args) {
FangDong fangDong = new FangDong();
ZhongjieProxy proxy = new ZhongjieProxy(fangDong);
proxy.zuFANG();
}
}
2 JDK动态代理
public class JDKProxy implements InvocationHandler{
private Object target;
public JDKProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = method.invoke(target, args);
return object;
}
}
public class ProxyTest {
public static void main(String[] args) {
FangDong fangDong = new FangDong();
JDKProxy jdkProxy = new JDKProxy(fangDong);
//ClassLoader loader:指定当前目标对象使用类加载器,写法固定
//Class<?>[] interfaces:目标对象实现的接口的类型,写法固定
//InvocationHandler h:事件处理接口,需传入一个实现类,一般直接使用匿名内部类
ZuFANG zufang = (ZuFANG) Proxy.newProxyInstance(fangDong.getClass().getClassLoader(), fangDong.getClass().getInterfaces(), jdkProxy);
zufang.zuFANG();
}
}
3 CGLIB动态代理
public class CGLIBProxy implements MethodInterceptor{
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy method) throws Throwable {
Object obj = method.invokeSuper(arg0, arg2);
return obj;
}
}
CGLIBProxy cglibProxy = new CGLIBProxy();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(FangDong.class);
enhancer.setCallback(cglibProxy);
ZuFANG zufang = (ZuFANG) enhancer.create();
zufang.zuFANG();