动态代理

一.静态代理
静态代理是代理模式的实现方式之一,程序编译时生成.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("葡萄");
   }
}
 
posted @ 2019-01-14 21:15  君奉天  阅读(170)  评论(0编辑  收藏  举报