新聞中心
說到代理,大家肯定都有接觸過。畢竟當(dāng)有些事務(wù)不想親自處理時(shí),會(huì)選擇委托給別人進(jìn)行解決。那么在java中也有著這樣的機(jī)制,叫做代理模式。主要分為兩大類:靜態(tài)代理和動(dòng)態(tài)代理。一種是運(yùn)行前就存在,另一種是運(yùn)行后才進(jìn)行創(chuàng)建。下面我們就java中的兩種代理模式進(jìn)行講解。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供余慶網(wǎng)站建設(shè)、余慶做網(wǎng)站、余慶網(wǎng)站設(shè)計(jì)、余慶網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、余慶企業(yè)網(wǎng)站模板建站服務(wù),10年余慶做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
1.靜態(tài)代理
由程序員創(chuàng)建或者由第三方工具生成,再進(jìn)行編譯;在程序運(yùn)行之前,代理類的.class文件已經(jīng)存在了。靜態(tài)代理通常只代理一個(gè)類,并且要事先知道代理的是什么。
public class BlogStaticProxy implements IBlogService{
private IBlogService blogService;
public BlogStaticProxy(IBlogService blogService) {
this.blogService = blogService;
}
@Override
public void writeBlog() {
System.out.println("start writing...");
blogService.writeBlog();
System.out.println("end writing...");
}
}
2.動(dòng)態(tài)代理
動(dòng)態(tài)代理的代理類在程序運(yùn)行前是不存在的,也就是說代理類在程序運(yùn)行時(shí)才創(chuàng)建的代理模式成為動(dòng)態(tài)代理。這種情況下,代理類并不是在Java代碼中定義好的,而是在程序運(yùn)行時(shí)根據(jù)我們的在Java代碼中的“指示”動(dòng)態(tài)生成的。
public class MainClass {
public static void main(String[] args) {
//1、創(chuàng)建一個(gè)真實(shí)角色
Singer target = new Singer();
//2、調(diào)用Proxy.newProxyInstance方法,并構(gòu)造一個(gè)InvocationHandler對(duì)象,
//3、在對(duì)象內(nèi)部重寫invoke方法,同時(shí)調(diào)用method.invoke(target,args);
//4、并在該方法的上下添加自己的代碼邏輯
//其中:target.getClass().getClassLoader():獲取類加載器,用來生成代理對(duì)象;
// target.getClass().getInterfaces()獲取接口元信息;
ISinger iSinger = (ISinger) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("動(dòng)態(tài)代理---向觀眾問好");//在真實(shí)對(duì)象的方法被調(diào)用“前”編寫自己的業(yè)務(wù)邏輯
Object returnValue = method.invoke(target,args);//此處通過反射調(diào)用真實(shí)對(duì)象對(duì)應(yīng)的方法;
System.out.println("動(dòng)態(tài)代理---向觀眾問好");//在真實(shí)對(duì)象的方法被調(diào)用“后”編寫自己的業(yè)務(wù)邏輯
return returnValue;
}
});
iSinger.sing();
}
}
//測(cè)試結(jié)果
"C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" "-javaagent:C:\Program.......
動(dòng)態(tài)代理---向觀眾問好
sing a song
動(dòng)態(tài)代理---向觀眾問好
Process finished with exit code 0
以上就是java代理模式的分類,學(xué)習(xí)完本篇的內(nèi)容后,想必大家已經(jīng)能對(duì)靜態(tài)代理和動(dòng)態(tài)代理有所區(qū)分。在實(shí)際使用時(shí),可以根據(jù)需求自行選擇。
本文標(biāo)題:創(chuàng)新互聯(lián)Python教程:java代理模式的分類
當(dāng)前URL:http://m.fisionsoft.com.cn/article/cdohhhe.html


咨詢
建站咨詢
