1拷泽、創(chuàng)建的代理類首先要實(shí)現(xiàn) InvocationHandler(java.lang.reflect.InvocationHandler)味赃、然后處理實(shí)現(xiàn)其中invoke()方法擅憔;???????????????? 2推姻、代理類中提供一個(gè)返回類型是Object、創(chuàng)建代理實(shí)例的方法(傳入目標(biāo)類 Object userService)供client調(diào)用,該方法return Proxy.newProxyInstance(args1,args2,args3); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ????????? args1:設(shè)置代碼使用的類加載器捶箱,一般采用和目標(biāo)類相同的加載器(this.userService.getClass().getClassLoader()); ? ? ? ? ? ? ? ? ? ? ?? ????????? args2:跟目標(biāo)類相同的接口(this.userService.getClass().getInterFaces()); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????? args3:設(shè)置回調(diào)對(duì)象翩迈,當(dāng)代理對(duì)象的方法被調(diào)用時(shí)會(huì)調(diào)用該參數(shù)指定對(duì)象的方法(this);即 invoke方法 ? ? ? ? ? ? ? ? ? ? ?????????????????? invoke(Object proxy, Method method, Object[] args)分別對(duì)應(yīng)代理類對(duì)象榨乎,可以訪問目標(biāo)對(duì)象的操作怎燥,可以傳遞到目標(biāo)對(duì)象的參數(shù);??????????? 3蜜暑、通過invoke 中的method訪問目標(biāo)對(duì)象铐姚,method.invoke(Object,args); 分別對(duì)應(yīng)目標(biāo)對(duì)象,傳給目標(biāo)對(duì)象的參數(shù)?????????????????????????????????? 4肛捍、client端創(chuàng)建目標(biāo)對(duì)象隐绵,代理實(shí)例,調(diào)用代理類中的創(chuàng)建實(shí)例方法拙毫; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? RealClass ? rc = new RealClass(); //創(chuàng)建真實(shí)對(duì)象 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? JdkProxy jdkProxy = new JdkProxy();//創(chuàng)建代理類??????? ? ? ?????????????????????????????????????????????????????????????????????????????????????????????????????? RealClass? proxyClass = RealClass)jdkProxy.createNewProxyInstatce(userService); //把真實(shí)類傳遞給代理實(shí)例 ?????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? proxyClass.save("");//調(diào)用目標(biāo)類中的save方法 ???
5依许、可以在代理中添加比如安全檢查等方法,或業(yè)務(wù)邏輯 ????????????????????????????????????????????????????????????????