Java动态代理和静态代理区别
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Java动态代理和静态代理区别
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                靜態(tài)代理
package staticproxy;/*** 接口* @author newtouch**/
public interface IHello {public void sayHello();public String doSomethong(String s);}
package staticproxy;/*** 實現(xiàn)類* @author newtouch**/
public class Hello implements IHello{@Overridepublic void sayHello() {System.out.println("zhangxiongfeng");}@Overridepublic String doSomethong(String s) {return s;}}
package staticproxy;/*** 靜態(tài)代理類* @author newtouch**/
/*** * @author newtouch* * 問題 如果接口中有多個方法 靜態(tài)代理中 就會有多重新代理的方法**/
public class StaticProxy {private IHello iHello;public StaticProxy(IHello iHello) {this.iHello=iHello;}public void sayHello() {iHello.sayHello();}public String doSomethong(String s) {return iHello.doSomethong(s);}}
package staticproxy;public class Test {public static void main(String[] args) {IHello iHello = new Hello();StaticProxy staticProxy = new StaticProxy(iHello);staticProxy.sayHello();System.out.println(staticProxy.doSomethong("zhangxiongfeng"));}}  動態(tài)代理:
package proxy;/*** 接口* @author newtouch**/
public interface IHello {public void sayHello();public String doSomethong(String s);}
package proxy;public class Hello implements IHello{@Overridepublic void sayHello() {System.out.println("zhangxiongfeng");}@Overridepublic String doSomethong(String s) {return s;}}
package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class DynamicProxy implements InvocationHandler {private IHello iHello;DynamicProxy(IHello iHello) {this.iHello = iHello;}/*** 調(diào)用接口 IHello接口中的  任何方法都是要用下面的方法執(zhí)行* *  可以不用像靜態(tài)代理中 每個方法都必須重寫 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//  在代理真實對象前我們可以添加一些自己的操作System.out.println("before rent house");System.out.println("Method:" + method);//    當(dāng)代理對象調(diào)用真實對象的方法時,其會自動的跳轉(zhuǎn)到代理對象關(guān)聯(lián)的handler對象的invoke方法來進(jìn)行調(diào)用method.invoke(iHello, args);//  在代理真實對象后我們也可以添加一些自己的操作System.out.println("after rent house");return null;}
}
package proxy;import java.lang.reflect.Proxy;public class Test {public static void main(String[] args) {// TODO Auto-generated method stubIHello iHello = new Hello();DynamicProxy dynamicProxy = new DynamicProxy(iHello);IHello hello = (IHello) Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(), iHello.getClass().getInterfaces(), dynamicProxy);// hello.sayHello();System.out.println(hello.doSomethong("zhangxf"));}}
動態(tài)代理執(zhí)行:
before rent house
Method:public abstract void proxy.IHello.sayHello()
zhangxiongfeng
after rent house
package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;public class ProxyFactory<T> {private T t;private InvocationHandler invocationHandler;public ProxyFactory(T t,InvocationHandler invocationHandler) {this.t = t;this.invocationHandler = invocationHandler;}public T newProxyInstance() {return (T)Proxy.newProxyInstance(invocationHandler.getClass().getClassLoader(), t.getClass().getInterfaces(), invocationHandler);}
}動態(tài)工廠
?
轉(zhuǎn)載于:https://www.cnblogs.com/zxf330301/p/9258512.html
總結(jié)
以上是生活随笔為你收集整理的Java动态代理和静态代理区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 领带多少钱啊?
- 下一篇: 卵巢早衰性不孕症的症状
