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

    实例:为程序添加日志

    1. ArithmeticCaluda.java

     1 public interface ArithmeticCaluda {
     2 
     3     /**
     4      * 加
     5      * @param a
     6      * @param b
     7      * @return 8      */
     9     double add(double a, double b);
    10 
    11     /**
    12      * 减
    13      * @param a
    14      * @param b
    15      * @return16      */
    17     double sub(double a, double b);
    18 
    19     /**
    20      * 乘
    21      * @param a
    22      * @param b
    23      * @return24      */
    25     double mul(double a, double b);
    26 
    27     /**
    28      * 除
    29      * @param a
    30      * @param b
    31      * @return32      */
    33     double div(double a, double b);
    34 
    35 }

    2.ArithmeticCaludaImp.java

     1 public class ArithmeticCaludaImp implements ArithmeticCaluda {
     2     /**
     3      * 加
     4      * @param a
     5      * @param b
     6      * @return 7      */
     8     public double add(double a,double b){
     9         double result=a+b;
    10         return result;
    11     }
    12     /**
    13      * 减
    14      * @param a
    15      * @param b
    16      * @return17      */
    18     public double sub(double a,double b){
    19         double result=a-b;
    20         return result;
    21     }
    22     /**
    23      * 乘
    24      * @param a
    25      * @param b
    26      * @return27      */
    28     public double mul(double a,double b){
    29         double result=a*b;
    30         return result;
    31     }
    32     /**
    33      * 除
    34      * @param a
    35      * @param b
    36      * @return37      */
    38     public double div(double a,double b){
    39         double result=a/b;
    40         return result;
    41     }
    42 }

    3.LogProxy.java

     1 import java.lang.reflect.InvocationHandler;
     2 import java.lang.reflect.Method;
     3 import java.lang.reflect.Proxy;
     4 import java.util.Arrays;
     5 
     6 public class LogProxy implements InvocationHandler{
     7     //被代理对象
     8     private Object target;
     9 
    10     public LogProxy(Object target) {
    11         super();
    12         this.target = target;
    13     }
    14     //得到代理对象
    15     public Object getProxy(){
    16         
    17         //ClassLoader对象,被代理对象进行加载
    18         ClassLoader loader=target.getClass().getClassLoader();
    19         
    20         //Interface接口的数组,被代理的对象实现的所有接口
    21         Class[] interfaces=target.getClass().getInterfaces();
    22         
    23         //InvocationHandler对象,代理实例的调用处理程序
    24         InvocationHandler h=this;
    25         
    26         return Proxy.newProxyInstance(loader, interfaces, h);
    27     }
    28     
    29     /**
    30      * proxy:     代理对象
    31      * method:   要调用被代理的方法的Method对象
    32      * args:      调用方法时接受的参数
    33      */
    34     @Override
    35     public Object invoke(Object proxy, Method method, Object[] args)
    36             throws Throwable {
    37         System.out.println("the "+method.getName()+" method begin with "+Arrays.asList(args));
    38         double result=(double) method.invoke(target, args);
    39         System.out.println("the "+method.getName()+" method end with ["+result+"]");
    40         return result;
    41     }
    42 }

    4.Test.java

     1 import com.eduask.liusheng.aop.proxy.ArithmeticCaluda;
     2 import com.eduask.liusheng.aop.proxy.ArithmeticCaludaImp;
     3 
     4 public class Test {
     5     public static void main(String[] args) {
     6         ArithmeticCaluda target=new ArithmeticCaludaImp();
     7         LogProxy logProxy=new LogProxy(target);
     8         ArithmeticCaluda proxy=(ArithmeticCaluda) logProxy.getProxy();
     9         
    10         double result=proxy.add(10, 10);
    11         System.out.println(result);
    12         
    13         result=proxy.sub(10, 10);
    14         System.out.println(result);
    15         
    16         result=proxy.mul(10, 10);
    17         System.out.println(result);
    18         
    19         result=proxy.div(10, 10);
    20         System.out.println(result);
    21     }
    22 }

    运行结果:

    the add method begin with [10.0, 10.0]
    the add method end with [20.0]
    20.0
    
    the sub method begin with [10.0, 10.0]
    the sub method end with [0.0]
    0.0
    
    the mul method begin with [10.0, 10.0]
    the mul method end with [100.0]
    100.0
    
    the div method begin with [10.0, 10.0]
    the div method end with [1.0]
    1.0

    JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理

    Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类

  • 相关阅读:
    (3)常用模块
    (2)ansible主机清单文件inventory
    (1)ansible基本配置
    文件权限之facl丶文件属性丶特殊权限
    文件权限之基本权限
    用户管理
    java jvm学习笔记二(类装载器的体系结构)
    java jvm学习笔记一
    观察者模式——转
    观察者模式
  • 原文地址:https://www.cnblogs.com/qq634571685/p/7154817.html
Copyright © 2011-2022 走看看