一、静态代理
//接口 interface All{ public void method1(); } //被代理類 class A implements All{ //重寫接口中的方法 public void method1(){ System.out.println("method"); } } //代理類 class B implements All{ All obj;//被代理類的聲明,也是代理類B的成員變量 public B(All obj){//構造器 this.obj = obj; } //重寫接口中的方法 public void method1(){ System.out.println("method"); obj.method1();//調用被代理類中的方法 } } public class TestRflection{ public static void main(String args[]){ //1、創建一個被代理類的對象 A a = new A(); //2、創建代理類的對象 B b = new B(a); //3、調用的是代理類的方法,但實際上調用的被代理類的方法 b.method1(); }
二、动态代理
//接口 interface All{ public void method1(); } //被代理類 class A implements All{ //重寫接口中的方法 public void method1(){ System.out.println("method"); } } //通過實現InvocationHandler接口的類,創建代理類的對象並且實現對被代理類中方法的調用 class B implements InvocationHandler{ Object obj;//被代理類對象的聲明 public Object setObject(Object obj){ this.obj = obj; //實例化被代理類 //通過Proxy類的靜態方法newProxyInstance動態的創建被代理類的對象,并返回 return Proxy.newProxyInstance(obj.getClass().getClassLoder(),obj.getClass().getInterfaces(),this); } @Override // 重寫InvocationHandler接口中的抽象方法,相當于是轉換成了對被代理類對象中方法的調用 public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ Object returnVal = method.invoke(obj,args); return returnVal;//返回的是被代理類中被調用的方法的返回值,若返回的是null,則說明調用的是void類型 } } public class TestRflection{ public static void main(String args[]){ //1、創建一個被代理類的對象 A a = new A(); //2、創建一個實現了InvocationHandler接口的類的對象 B b = new B(); //3、調用setObject()方法,動態的創建一個Object類型的代理類的對象 Object c = b.setObject(a); //4、在創建代理類的那個方法也實現了All接口 (All)d = All(c); //5、此時就可以掉用被代理類的方法了 d.method1(); }
总结:
静态代理,其实就是静态的创建某一个代理类,只适合代理这一个被代理的类,如果想要代理其他的类,就必须再显示的写一个其他类的代理类;
而动态代理,其实就是动态的创建一个代理类,可代理多个被代理的类,能够创建任何一个被代理类的代理类。这样就减少了代码量,提高了开发效率
PS:AOP(面向切面的编程),会用到动态代理,即在invoke()方法的前面和后面可能是其他类的方法,invoke本身就是一个动态的方法,它会应调用的对象的不同,而实现不同的方法。