1. 程式人生 > >類的加載機制和反射——五、使用反射生成JDK動態代理

類的加載機制和反射——五、使用反射生成JDK動態代理

復用 他也 new mil ont throwable logs object load

使用反射生成JDK動態代理

1.使用Proxy和InvocationHandler創建動態代理

(1)Proxy提供了用於創建動態代理類和動態代理對象的靜態方法,他也是所有動態代理類的父類。

(2)如果在程序中為一個或多個接口動態的生成實現類,就可以使用Proxy來創建動態代理類,如果需要為一個或多個接口動態的創建實例,也可以使用Proxy來創建動態代理實例。

(3)Proxy提供了兩個方法來創建動態代理類和動態實例:

  1)static Class<?> getProxyClass(ClassLoader loader,Class<?>...interface):

    創建一個動態代理類所對應的Class對象,該代理類將實現interface所指定的多個接口。第一個     ClassLoader參數指定生成動態代理類的類加載器;

  2)static Object newProxyInstance(ClassLoader laoder,Class<?>[] interface,InvocationHandler h):

    直接創建一個動態代理對象,該代理對象的實現類實現了interface指定的系列接口,執行代理對象的每個 方法時都會被替換執行InvocationHandlerd對象的invoke方法;

(4)使用Proxy和InvocationHandler生成動態代理對象

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; //定義一個接口 interface Person{ void walk(); void sayHello(String name); } //實現InvocationHandler接口的類 class MyInvocationHandler implements InvocationHandler{ /* * 執行動態代理的所有方法時,都會被替換成如下的invoke方法 * proxy——動態代理對象 * method——正在執行的方法 * args——調用目標方法時所傳入的參數
*/ //InvocationHandler中所需實現的方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("正在執行的方法:"+method); if(args!=null){ System.out.println("下面是執行該方法時傳入的參數:"); for(Object val:args){ System.out.println(val); } }else{ System.out.println("調用該方法沒有實參!"); } return null; } } public class ProxyTest { public static void main(String[] args)throws Exception{ //創建一個InvocationHandler對象 InvocationHandler handler = new MyInvocationHandler(); //使用指定的InvocationHandler來生成一個動態代理對象 Person p = (Person)Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[]{Person.class}, handler); //調用動態代理對象的方法 p.walk(); p.sayHello("aaa"); } }

2.動態代理和AOP

  用於方便代碼的復用以及後期修改(暫時想到的)。

類的加載機制和反射——五、使用反射生成JDK動態代理