zoukankan      html  css  js  c++  java
  • [java] JDK 的动态代理机制

    首先说下,鉴于网上大量的垃圾代码,以及设计模式上面讲的很难看懂,本人写了个超级简单的(或许只是二逼的我认为的,呵呵)

    首先说下个人的理解:代理的目的就是在你做事之前、之后、过程中。。。不改变你的行为(代码)加点其他东东

    动态代理代码如下:

    1 package proxy.myproxy.dynamicProxy;
    2 
    3 public interface UserDao {
    4     void save();
    5 }
    复制代码
    1 package proxy.myproxy.dynamicProxy;
    2 
    3 public class UserDaoImpl implements UserDao {
    4 
    5     public void save() {
    6         System.out.println("UserDao save()");
    7     }
    8 
    9 }
    复制代码
    复制代码
     1 package proxy.myproxy.dynamicProxy;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 
     6 public class InvocationHandlerImpl implements InvocationHandler {
     7     
     8     private Object target;
     9     
    10     public InvocationHandlerImpl(Object target){
    11         this.target = target;
    12     }
    13     
    14     public Object invoke(Object proxy, Method method, Object[] args)//args是那个你执行的那个方法的参数
    15             throws Throwable {
              System.out.println(proxy.getClass());//这里输出:class $Proxy0,可以看出proxy是什么
            System.out.println(target.getClass());//这里输出:class proxy.myproxy.dynamicProxy.UserDaoImpl,可以看出target是什么
    16 System.out.println("开始记录日志"); 17 Object obj = method.invoke(target, args);//obj是方法执行完之后的返回值 18 System.out.println("结束记录日志"); 19 return obj; 20 } 21 }
    复制代码
    复制代码
     1 package proxy.myproxy.dynamicProxy;
     2 
     3 import java.lang.reflect.Proxy;
     4 
     5 public class Test {
     6     public static void main(String[] args) {
     7         UserDao userDao = new UserDaoImpl();
     8         
     9         UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), new InvocationHandlerImpl(userDao));
    10         
    11         userDaoProxy.save();
    12         
    13     }
    14 }
    复制代码

     

     

     

    静态代理代码如下:

    1 package proxy.myproxy.staticProxy;
    2 
    3 public interface UserDao {
    4     void save();
    5 }
    复制代码
    1 package proxy.myproxy.staticProxy;
    2 
    3 public class UserDaoImpl implements UserDao {
    4 
    5     public void save() {
    6         System.out.println("UserDao save()");
    7     }
    8 
    9 }
    复制代码
    复制代码
     1 package proxy.myproxy.staticProxy;
     2 
     3 public class UserDaoImplProxy implements UserDao {
     4     
     5     private UserDao userDao = new UserDaoImpl();//合成   也可以传个引用过来
     6     
     7     
     8     
     9     public void save() {
    10         
    11         System.out.println("开始记录日志。。。");
    12         
    13         userDao.save();
    14         
    15         System.out.println("结束记录日志。。。。");
    16         
    17     }
    18 
    19 }
    复制代码
    复制代码
     1 package proxy.myproxy.staticProxy;
     2 
     3 public class Test {
     4     public static void main(String[] args) {
     5         UserDao userDao =  new UserDaoImplProxy();
     6         
     7         userDao.save();
     8         
     9     }
    10 }
    复制代码

     

     

     

    要是不知道代理的意思就去so、谷歌下,本人强烈建议谷歌

    要是看不懂代码可以回复。


  • 相关阅读:
    Kendo
    过河
    数组分组(简单dp)
    Codeforces Round #604 (Div. 2)(A-E)
    HDU1253
    HDU1026
    linux常用命令(二) --目录操作
    linux常用命令(一)--ls
    hdu 1072
    Codeforces Round #597 (Div. 2)(A-D)
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786817.html
Copyright © 2011-2022 走看看