动态代理
一.静态代理
静态代理是代理模式的实现方式之一,程序编译时生成.class文件,如果我们需要很多的代理,每一个都这么手动的去创建实属浪费时间,而且会有大量的重复代码。
1.定义接口
2.创建具体实现类
3.创建代理类
4.测试
public interface User { void eat(String name); } public class UserImpl implements User { public void eat(String name) { System.out.println("我要吃"+name); } } public class UserProxy implements User { private UserImpl user=new UserImpl(); public void eat(String name) { System.out.println("静态代理前置"); user.eat(name); System.out.println("静态代理后置"); } } public class Main { public static void main(String[] args) { UserProxy userProxy=new UserProxy(); userProxy.eat("橙子"); } }
二.动态代理
动态代理类在运行时创建生成
JDK动态代理:
1.定义接口
2.创建具体实现类
3.创建代理类(实现InvocationHandler接口),重写invoke方法
4.测试,通过Proxy的静态方法:newProxyInstance(ClassLoader loader,Class[] interfaces,Invocation Handler h)创建一个代理对象
然后通过代理对象调用方法
public interface User { void eat(String name); } public class UserImpl implements User { public void eat(String name) { System.out.println("我要吃"+name); } } public class UserProxy implements InvocationHandler { private Object object; public UserProxy(Object obj){ this.object=obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("前置内容"); method.invoke(object,args); System.out.println("后置内容"); return null; } } public class Main { public static void main(String[] args) { User user=new UserImpl(); InvocationHandler handler=new UserProxy(user); User user2=(User) Proxy.newProxyInstance( User.class.getClassLoader(),new Class[]{User.class},handler); user2.eat("苹果"); } }
Cglib动态代理:
JDK动态代理拥有局限性,那就是必须面向接口编程,没有接口就无法实现代理
依靠继承来实现动态代理的方式,不再要求我们必须要有接口
1.创建具体类
2.创建代理类(实现MethodInterceptor接口),重写intercept方法
3.测试
public class User { public void eat(String name){ System.out.println("我要吃"+name); } } public class UserProxy implements MethodInterceptor { public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("前置处理"); Object object=methodProxy.invokeSuper(o,objects); System.out.println("后置处理"); return object; } } public class Main { public static void main(String[] args) { Enhancer enhancer=new Enhancer(); //字节码增强器 enhancer.setSuperclass(User.class); //设置被代理类为父类 enhancer.setCallback(new UserProxy()); //设置回调 User user=(User)enhancer.create(); //创建代理实例 user.eat("葡萄"); } }