Java開發(fā)的應該
如何掌握上述相關技術?
Java開發(fā)的應該如何掌握上述相關技術?
一:首先,有這樣的一種情況很常見,對于想自學Java開發(fā)的人來說,他們
大多數都是非常盲目的,不知道自己改如何入手,很多人在網上找一些視頻,然后瘋狂的過視頻,很快就把一塊內容都學完,他們理解的學完了就是視
頻看完了,但是讓他們動手去做東西卻做不出來,而我的理解學完了就是自己能寫出東西,所以對于初學者來說一定不能盲目,要有自己的規(guī)劃,不然
就是浪費時間白忙活。
二:既然是學習Java開發(fā)專業(yè)技術,我個人的建議是,一定要有一個能指導
你的人,不能都靠自己閉門造車,這樣的行為并不聰明,結識一位這方面的人才,時不時去問問人家問題,不然你可能會發(fā)現一個小問題能困擾你一天
,**后還不知道是什么原因。
三:學習Java開發(fā)技術,不能跟學數學語文一樣對待,比較剛接觸代碼是不
容易記住的,所以要掌握上述的技術,你還要知道學習Java開發(fā)技術有哪些“坑”。對于學習方法這塊是尤為重要的,怎么學才能讓你學完了能記住之
前學的那些,不至于學完了就忘,這個問題值得你學習之前去思考的。
四:根據我多年的學習情況來看,你平時一定要養(yǎng)成好的學習習慣,就說我
自己吧!我就喜歡把自己曾經遇到的問題整理在電腦的日記本上,然后我會搜集一下博客相關的Java技術文章,一些我認為比較有用的網站,以后都能
用的上,這是我個人的學習習慣,相信我,如果你想走的更遠,一定要養(yǎng)成習慣。
**后給大家一些詳細的學習安排路線:
Java基礎:Java基礎語法、數組、類與對象、繼承與多態(tài)、異常、范型、集
合、流與文件、反射、枚舉、自動裝箱和注解。
數據庫:mysql、oracle
Javaweb:HTML與CSS網頁開發(fā)基礎、Java腳本語言、搭建開發(fā)環(huán)境、JSP基
本語法、JSP內置對象、JavaBean技術、Servlet技術、Ajax技術
框架:Struts2、Hibernate、Spring、SpringMVC、mybatis
設計模式之代理模式
>
代理模式在我們生活中是十分常見的,例如,幫我打包午飯,幫我拿一下快遞,這些是我們日常的代理模式。其中你是委托人,代理人是你朋友,而事件就是打包午飯、拿快遞。
簡介
代理模式的定義:PRovide a surrogate or placeholder for another object to controlaccess to it(為其他對象提供一種代理以控制對這個對象的訪問)。
模式中的角色與職責
Subject: 抽象主題類
該類的主要職責是申明真是主題與代理的共同接口方法,該類既可以是個抽象類也可以是個接口(具有抽象方法)。
RealSubject: 真實主題類
該類也稱為委托類或者被代理類,該類定義了代理所表示的真是對象(也就是實現了抽象方法),由其執(zhí)行具體的業(yè)務邏輯。
ProxySubject:代理類
這個類的對象持有一個對真實主題的引用,在這個類所實現的接口方法中調用真實主題類中相應的方法執(zhí)行,這樣就實現了代理的目的。
Client:客戶類
也就是使用代理類的類型,客戶類**代理類間接地調用了真實主題類中定義的方法。
代理模式可以分為靜態(tài)代理和動態(tài)代理。
靜態(tài)代理
具體實現代碼如下:
public class javaDemo {
public static void main(String[] args) {
ProxySubject proxySubject = new ProxySubject(new RealSubject());
proxySubject.request();
}
}
interface Subject {
abstract void request();
}
class RealSubject implements Subject {
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("To do something.");
}
}
class ProxySubject implements Subject {
private RealSubject mRealSubject;
public ProxySubject(RealSubject realSubject) {
super();
// TODO Auto-generated constructor stub
mRealSubject = realSubject;
}
@Override
public void request() {
// TODO Auto-generated method stub
mRealSubject.request();
}
}
**示例代碼相信大家對靜態(tài)代理有了一定的理解。
1.委托人和代理人都可以完成同樣一件事。(實現同一個接口)
2.委托人告訴代理人去完成這件事,代理人才去做這件事。(代理人需要持有委托人引用)
動態(tài)代理
同樣是帶午飯的場景,但是自己寫代碼寫到忘記了時間,一抬頭發(fā)現同事都走光了,那么誰能幫自己帶個飯呢?在等待的過程中是誰先出現,張三還是李四?(程序需要動態(tài)創(chuàng)建一個對象)而且**重要的是出現的那個同事要能幫自己帶飯才行(上步創(chuàng)建的對象需要實現Subject接口)
public class JavaDemo {
public static void main(String[] args) {
final Subject realSubject = new RealSubject();
//**個參數,目標的裝載器
//第二個參數,目標接口,為每個接口生成代理
//第三個參數,實現了InvocationHandler接口,當你一調用代理,代理就會調用InvocationHandler的invoke方法
Subject subject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
//調用目標方法
return method.invoke(realSubject, args);
}
});
subject.request();
}
}
interface Subject {
abstract void request();
}
class RealSubject implements Subject {
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("To do something.");
}
}
InvocationHandler相當于一個處理器,在invoke方法中我們能夠操作真實對象,可以附加其他操作。而我們**Proxy.newProxyInstance(..)方法生成代理。實現InvocationHandler接口并附加操作后,獲取代理角色。
動態(tài)代理的重點在于Proxy.newProxyInstance(),有興趣的同學可以看看里面的實現源碼。主要步驟是:
1.ProxyGenerator.generateProxyClass方法負責生成代理類的字節(jié)碼,生成邏輯比較復雜,有興趣的同學可以繼續(xù)分析源碼 sun.misc.ProxyGenerator;
2.native方法Proxy.defineClass0負責字節(jié)碼加載的實現,并返回對應的Class對象。
3.利用clazz.newInstance反射機制生成代理類的對象;
而動態(tài)代理是相當強大的,下面我們自己看一下Retrofit的動態(tài)代理例子:
Retrofit是現在**火的Android網絡請求框架之一,相信大家或多或少都有了解過。我們看一下Retrofit怎么使用動態(tài)代理模式的。
1.創(chuàng)建一個請求方法的接口:
public interface HttpService {
@FormUrlEncoded
@POST(URLs.Login)
Call<JSObject> login(@FieldMap() Map<String, String> maps);
}
2.生成Retrofit對象,并且創(chuàng)建一個實現了GitHubServiece接口的實體類:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.build();
HttpService mHttpService = retrofit.create(HttpService.class);
上面的大家用過Retrofit都會很熟悉,我們看一下create()的代碼:
public <T> T create(final Class<T> service) {
Utils.validateServiceInterface(service);
if (validateEagerly) {
eagerlyValidateMethods(service);
}
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get();
@Override public Object invoke(Object proxy, Method method, Object... args)
throws Throwable {
// If the method is a method from Object then defer to normal invocation.
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
ServiceMethod serviceMethod = loadServiceMethod(method);
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
經過上面對動態(tài)代理的理解,對create()封裝的代碼,一看就非常清楚,就是動態(tài)代理模式嘛。
了解了靜態(tài)代理和動態(tài)代理可能大家會想,在代碼層面上本來就可以自己完成,為什么要交給其他類完成呢?這樣不是多此一舉嗎?但在實際開發(fā)中,使用代理模式的作用有:
解耦:這是設計模式解決的基本問題。在這里委托類只需要做好自己的部分工作,然而一些額外的事情可以交給代理類完成。如自己準備結婚,但是不可能自己去一手一腳去準備整個婚禮,我們自己只需要請婚慶公司,定好價錢然后婚慶公司就能幫我們解決整場婚禮的大小事,我們自己不需要婚慶公司怎么完成,這樣是不是將我與結婚事件進行了解耦。
攔截、擴展:代理類在實現接口方法的時候,除了調用委托類方法外,還可以在不修改委托類的情況下,增加一些其他需求功能。如我們試想在實現類滿足要求時,我們可以直接使用實現類,但是實現類再滿足不了需求的時候,我們就得擴展,但是根據開閉原則,我們不能直接修改實現類的代碼,這樣我們可以**代理類可擴展功能;另外就是我們權限分配,我們可以根據對申請權限的對象進行攔截,根據不同的角色條件做判斷,然后再分配對用的權限。
相關推薦:
蘇州JAVA培訓 蘇州JAVA培訓班 蘇州JAVA培訓機構