zoukankan      html  css  js  c++  java
  • 动态代理

     1 分为jdk自带代理
     2 实现接口 InvocationHandler  ,用反射调用方法
     3 获取代理类:Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(), new TestProxy(obj));
     4 
     5 实例:
     6 public interface ReadFile {
     7     public void read();
     8 }
     9 
    10 public class Boss implements ReadFile {
    11     @Override
    12     public void read() {
    13         System.out.println("I'm reading files.");
    14     }
    15 }
    16 
    17 public class Secretary implements InvocationHandler {
    18     private Object object;
    19     public Secretary(Object object) {
    20         this.object = object;
    21     }
    22     @Override
    23     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    24         System.out.println("I'm secretary.");
    25         Object result = method.invoke(object, args);
    26         return result;
    27     }
    28 }
    29 
    30 public class Main {
    31     public static void main(String[] args) {
    32         ReadFile boss = new Boss();
    33         InvocationHandler handler = new Secretary(boss);
    34         ReadFile secretary = (ReadFile) Proxy.newProxyInstance(
    35                 boss.getClass().getClassLoader(),
    36                 boss.getClass().getInterfaces(),
    37                 handler);
    38         secretary.read();
    39     }
    40 }
    41 
    42 
    43 
    44 CGLIB具有简单易用,它的运行速度要远远快于JDK的Proxy动态代理:
    45 public class CglibProxy implements MethodInterceptor {
    46     @Override
    47     public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    48         System.out.println("++++++before " + methodProxy.getSuperName() + "++++++");
    49         System.out.println(method.getName());
    50         Object o1 = methodProxy.invokeSuper(o, args);
    51         System.out.println("++++++before " + methodProxy.getSuperName() + "++++++");
    52         return o1;
    53     }
    54 }
    55 public class Main2 {
    56     public static void main(String[] args) {
    57         CglibProxy cglibProxy = new CglibProxy();
    58  
    59         Enhancer enhancer = new Enhancer();
    60         enhancer.setSuperclass(UserServiceImpl.class);
    61         enhancer.setCallback(cglibProxy);
    62  
    63         UserService o = (UserService)enhancer.create();
    64         o.getName(1);
    65         o.getAge(1);
    66     }
    67 }
  • 相关阅读:
    mysql explain语句各项含义
    group_concat用法以及字符串太长显示不全
    合并两个word文档,保持样式不变
    读取word模板,填充数据后导出
    java获取配置文件信息
    mysql5.6免安装使用
    时间格式转换
    Mysql中(@i:=@i+1)的作用
    SVN服务器搭建和使用(一)
    按需讲解之Supervisor
  • 原文地址:https://www.cnblogs.com/cowshed/p/11397682.html
Copyright © 2011-2022 走看看