zoukankan      html  css  js  c++  java
  • JAVA JDK的动态代理反射实现

     动态代理类使用到了一个接口InvocationHandler和一个代理类Proxy ,这两个类配合使用实现了动态代理的功能。
     什么是动态代理呢?
     普通代理类是指: 给每个具体类写一个代理类,以后要使用某个具体类时,只要创建它的代理类的对象,然后调用代理类的方法就实现。
     可是如果现在有许多的具体类,那就需要有许多的代理类才可以,这样很显然不合适。所以动态代理就应运而生了,我们只要写一个类实现
     InvocationHandler 并实现它的invoke方法,然后再用Proxy的工厂方法newProxyInstance()创建一个代理对象,这个对象同样可以实现对具体类的代理功能。
     而且想代理哪个具体类,只要给Handler(以下代码中的Invoker)的构造器传入这个具体对象的实例就可以了。感觉是不是自己为该具体类造了一个代理类呢?

    import java.lang.reflect.InvocationHandler;  
    import java.lang.reflect.Method;  
    import java.lang.reflect.Proxy;  
    
    //接口类 计算接口 
    interface  ICal {  
       public int  Cal(int a,int b);  
    }  
     //  加法实现
    class ClassAdd  implements  ICal {  
        @Override  
        public int  Cal(int a,int b){  
        	 System.out.println("ClassAdd!");  
             return a+b;
      }  
    }  
    // 减法实现
    class ClassSub  implements  ICal {  
    	 @Override  
    	    public int  Cal(int a,int b){  
    		 System.out.println("ClassSub!");  
    	     return a-b;
    	  }  
    }  
    

     

    代理类实现 非常通用的实现方式:

    //动态代理类,实现InvocationHandler接口  
    class DynamicProxy implements InvocationHandler {  
    	private Object target;
        public DynamicProxy(Object ac) {  
           this.target = ac;  
        }  
        //动态生成代理对象
        public Object getDynamicProxyObject(){
            return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),this.target.getClass().getInterfaces(),this);
        }
    @Override  
    public Object invoke(Object proxy, Method method, Object[] arg)  
           throws Throwable {  
       //调用之前可以做一些处理  
      System.out.println("Method before!");  
      Object result= method.invoke(target, arg);  
      //调用之后也可以做一些处理  
      System.out.println("Method after!");  
      return result;  
    }  
    }  
    

     调用方式

       

    /** 
    * 测试类 
    */  
    class DynamicProxyTest {  
    
    public static void main(String[] args) {  
        //创建加法类的代理对象  
    	ICal calProxyObject= (ICal) new DynamicProxy(new ClassAdd()).getDynamicProxyObject();
        //调用加法类的计算方法。  
       int add=  calProxyObject.Cal(5,3);   
       System.out.println(add);   
      }  
    }  
    

      

    Cglib动态代理
    JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

    请参考

     http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

     

  • 相关阅读:
    合理配置SQL Server的最大内存
    理解内存----优化SQL Server内存配置
    Systems Performance: Enterprise and the Cloud 读书笔记系列
    google perftools分析程序性能
    源代码分析-构建调用图
    Intel VTune性能分析器基础
    代微机原理与接口技术(第3版)课程配套实验包和电子课件
    【MySQL性能优化】MySQL常见SQL错误用法
    Linux 内核分析 -- Linux内核学习总结
    《Linux就该这么学》 软件库
  • 原文地址:https://www.cnblogs.com/dragonsuc/p/5428560.html
Copyright © 2011-2022 走看看