代理分为:静态代理 JDK代理 cglib代理
jdk动态代理的本质:在内存中构建出接口的实现类
特点:被代理对象必须有接口
cglib代理的本质:在内存中生成被代理对象的子类
特点:可以在没有接口的情况下代理
静态例子: ① 建一个简单的Subject接口
② 建一个Subject的实现类
③ 建一个增强类(也实现Subject接口)
public interface Subject { public void say(); public String says(); public void sayss() throws MyException; public void sayt(); }
public class RealSubject implements Subject { public void say() { System.out.println("say"); } }
public class ProxySubject implements Subject{ private Subject subject; public void say() { System.out.println("=====before====="); subject.say(); }}
//jing静态代理 @Test public void test01(){ Subject subject=new RealSubject(); ProxySubject subject1=new ProxySubject(); subject1.setSubject(subject); subject1.say(); }
JDK代理的例子:
① 建一个简单的Subject接口
② 建一个Subject的实现类
与上面雷同
//JDK 动态代理 @Test public void test02(){ final Subject subject=new RealSubject(); Subject subject1= (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object o, Method method, Object[] args) throws Throwable { Object invoke = method.invoke(subject, args); System.out.println("==before=="); return null; } }); subject1.say(); }
cglib代理的例子:
① 建一个简单的Subject接口
② 建一个Subject的实现类
与上面雷同
//cglib 动态代理 @Test public void test03(){ final RealSubject subject=new RealSubject(); Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(subject.getClass()); enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("===before==="); method.invoke(subject,objects); return null; } }); RealSubject subject1= (RealSubject)enhancer.create(); subject1.say(); }