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

 

原文地址:https://www.cnblogs.com/dragonsuc/p/5428560.html