Java动态代理和静态代理区别
生活随笔
收集整理的這篇文章主要介紹了
Java动态代理和静态代理区别
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
靜態(tài)代理
package staticproxy;/*** 接口* @author newtouch**/
public interface IHello {public void sayHello();public String doSomethong(String s);}
package staticproxy;/*** 實(shí)現(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* * 問(wèn)題 如果接口中有多個(gè)方法 靜態(tài)代理中 就會(huì)有多重新代理的方法**/
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"));}} 動(dòng)態(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)代理中 每個(gè)方法都必須重寫 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 在代理真實(shí)對(duì)象前我們可以添加一些自己的操作System.out.println("before rent house");System.out.println("Method:" + method);// 當(dāng)代理對(duì)象調(diào)用真實(shí)對(duì)象的方法時(shí),其會(huì)自動(dòng)的跳轉(zhuǎn)到代理對(duì)象關(guān)聯(lián)的handler對(duì)象的invoke方法來(lái)進(jìn)行調(diào)用method.invoke(iHello, args);// 在代理真實(shí)對(duì)象后我們也可以添加一些自己的操作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"));}}
動(dòng)態(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);}
}動(dòng)態(tài)工廠
?
轉(zhuǎn)載于:https://www.cnblogs.com/zxf330301/p/9258512.html
總結(jié)
以上是生活随笔為你收集整理的Java动态代理和静态代理区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 领带多少钱啊?
- 下一篇: 工作经验:Java 系统记录调用日志,并