1绩卤、反射
- Java反射機(jī)制是在運(yùn)行狀態(tài)中椒丧,對(duì)于任意一個(gè)類或?qū)ο螅寄苤啦⒄{(diào)用其所有屬性和方法砌梆。這樣動(dòng)態(tài)獲取新的以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能就叫做反射默责。
- 類成員主要包括構(gòu)造函數(shù),變量和方法咸包。而Member的Field傻丝、Method、Constructor這三個(gè)實(shí)現(xiàn)類就分別描述變量诉儒、方法葡缰、構(gòu)造函數(shù)。而這些類都沒(méi)有public構(gòu)造方法,只能通過(guò)Class類獲取泛释。
- 獲取到對(duì)應(yīng)的構(gòu)造函數(shù)滤愕,變量和方法,就可以獲取他們的一些信息:如:類型怜校、修飾符间影、注解、名稱等茄茁,并使用他們魂贬。
2、代理模式
代理模式是結(jié)構(gòu)型設(shè)計(jì)模式裙顽,它為對(duì)象的間接訪問(wèn)提供了一個(gè)解決方案付燥,可以對(duì)對(duì)象的訪問(wèn)進(jìn)行控制。
- 應(yīng)用場(chǎng)景:當(dāng)無(wú)法或不想直接訪問(wèn)某個(gè)對(duì)象愈犹、訪問(wèn)某個(gè)對(duì)象存困難時(shí)键科,通過(guò)一個(gè)代理對(duì)象來(lái)間接訪問(wèn)。
- 優(yōu)點(diǎn):能夠協(xié)調(diào)調(diào)用者和被調(diào)用者漩怎,在一定程度上降低了系統(tǒng)的耦合度勋颖;客戶端可以針對(duì)抽象主題角色進(jìn)行編程,增加和更換代理類無(wú)須修改源代碼勋锤,符合開(kāi)閉原則饭玲,系統(tǒng)具有較好的靈活性和可擴(kuò)展性。
- 缺點(diǎn):由于在客戶端和真實(shí)主題之間增加了代理對(duì)象叁执,因此有些類型的代理模式可能會(huì)造成請(qǐng)求的處理速度變慢咱枉,例如保護(hù)代理;實(shí)現(xiàn)代理模式需要額外的工作徒恋,而且有些代理模式的實(shí)現(xiàn)過(guò)程較為復(fù)雜蚕断,例如遠(yuǎn)程代理。
- 靜態(tài)代理:代碼運(yùn)行前入挣,即 在代理類實(shí)現(xiàn)時(shí)就指定與目標(biāo)對(duì)象類相同的接口亿乳。特點(diǎn):1個(gè)靜態(tài)代理 只服務(wù)1種類型的目標(biāo)對(duì)象
- 動(dòng)態(tài)代理:運(yùn)行時(shí),不需要顯示實(shí)現(xiàn)與目標(biāo)對(duì)象相同的接口径筏,而是將這種實(shí)現(xiàn)推遲到程序運(yùn)行時(shí)由JVM來(lái)實(shí)現(xiàn)葛假。特點(diǎn):只需要1個(gè)動(dòng)態(tài)代理類就可以解決創(chuàng)建多個(gè)、靜態(tài)代理的問(wèn)題滋恬,避免重復(fù)聊训、多余代碼、更強(qiáng)的靈活性恢氯。
- 舉例:getService();
代理模式類型較多带斑,其中遠(yuǎn)程代理鼓寺、虛擬代理、保護(hù)代理等在軟件開(kāi)發(fā)中應(yīng)用非常廣泛勋磕。
3妈候、equals和==的區(qū)別
“==”是關(guān)系運(yùn)算符。比較兩個(gè)數(shù)值之間的大小挂滓,其運(yùn)算結(jié)果為一個(gè)邏輯類型(boolean布爾類型)的數(shù)值苦银。基本數(shù)據(jù)類型比較的是具體值赶站;引用數(shù)據(jù)類型比較的是地址值幔虏。
equals是一個(gè)方法。比較兩個(gè)對(duì)象是否相等贝椿,在Object中定義了該方法想括,通過(guò)內(nèi)存地址值來(lái)判斷兩個(gè)對(duì)象是否相等。在String中重寫(xiě)了equals方法团秽,依次通過(guò):地址值主胧、長(zhǎng)度叭首、hashCode习勤、遍歷對(duì)比來(lái)判斷兩個(gè)對(duì)象是否相等。
4焙格、Java堆和棧的區(qū)別
聯(lián)系:
在堆中產(chǎn)生了一個(gè)數(shù)組或者對(duì)象后图毕,還可以在棧中定義一個(gè)特殊的變量,變量的值就等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址眷唉,而這個(gè)棧中的特殊變量予颤,也就成為數(shù)組或?qū)ο蟮囊米兞俊R院罂梢栽诔绦蛑惺褂脳?nèi)存中的引用變量訪問(wèn)堆內(nèi)存中的數(shù)組或?qū)ο罅?/p>
區(qū)別:
堆:jvm只有一個(gè)堆區(qū)(heap)被所有線程共享冬阳;堆內(nèi)存用于存放由new創(chuàng)建的對(duì)象和數(shù)組蛤虐;在堆內(nèi)存中分配的內(nèi)存空間,由java虛擬機(jī)自動(dòng)垃圾回收器來(lái)管理肝陪;在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存驳庭,存取速度較慢。
棧:每個(gè)棧中的數(shù)據(jù)都是私有的氯窍,其他棧不能訪問(wèn)饲常;每個(gè)線程包含一個(gè)棧區(qū),棧中只保存基本類型的變量和對(duì)象的引用變量狼讨;當(dāng)在一段代碼塊中聲明了一個(gè)變量時(shí)贝淤,java就會(huì)在棧內(nèi)存中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過(guò)變量的作用域之后政供,java也會(huì)自動(dòng)釋放為該變量分配的空間播聪,而這個(gè)回收的空間可以即刻用作他用朽基;棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性犬耻、存取速度比堆要快踩晶。
5、sleep()和wait()區(qū)別
sleep是Thread類的方法枕磁,wait是Object類的方法渡蜻。
sleep是自動(dòng)喚醒,wait需要其他線程來(lái)喚醒计济。
sleep不會(huì)釋放同步鎖茸苇,wait會(huì)釋放同步鎖。
sleep可以用在任意方法中沦寂,wait只能用在同步方法或同步塊中
sleep 必須捕獲異常,而 wait,notify 和 notifyAll 不需要捕獲異常
6.android系統(tǒng)啟動(dòng)流程
- 從系統(tǒng)開(kāi)機(jī)供電開(kāi)始学密,正確復(fù)位后,Cup開(kāi)始執(zhí)行第一條指令引導(dǎo)程序BootLoader來(lái)裝載用戶程序传藏。
- BootLoader引導(dǎo)程序先初始化硬件設(shè)備腻暮,并提供了調(diào)試功能,如果用戶沒(méi)有進(jìn)行調(diào)試毯侦,則會(huì)從預(yù)先定好的地址(NAND Flash)中裝載Linux內(nèi)核哭靖。
- Linux內(nèi)核從從start_kernel函數(shù)開(kāi)始進(jìn)行整個(gè)系統(tǒng)初始化,初始化完成之后侈离,調(diào)用init_post()函數(shù)啟動(dòng)Init 進(jìn)程试幽。此時(shí)內(nèi)核啟動(dòng)結(jié)束,進(jìn)入用戶空間卦碾。
- init進(jìn)程會(huì)掛載文件系統(tǒng)铺坞、設(shè)置系統(tǒng)屬性、裝載進(jìn)程信號(hào)處理器然后解析Init.rc文件洲胖,根據(jù)Init.rc文件的描述:系統(tǒng)會(huì)初始化屬性和啟動(dòng)Android系統(tǒng)重要的守護(hù)進(jìn)程济榨,其中最重要的是ServiceManager、Zygote等進(jìn)程绿映。
- 5.Zygote進(jìn)程是所有Android進(jìn)程的母體擒滑,包括system_server和各個(gè)App進(jìn)程。
創(chuàng)建AppRuntime并調(diào)用AppRuntime.start()方法:
1.調(diào)用AndroidRuntime的startVM()方法創(chuàng)建虛擬機(jī)
2.調(diào)用startReg()注冊(cè)JNI函數(shù)绘梦;
3.通過(guò)JNI方式調(diào)用ZygoteInit.main()橘忱,第一次進(jìn)入Java世界;
4.registerZygoteSocket()建立socket通道卸奉,zygote作為通信的服務(wù)端钝诚,用于響應(yīng)客戶端請(qǐng)求;
5.preload()預(yù)加載通用類榄棵、drawable和color資源凝颇、openGL以及共享庫(kù)以及WebView潘拱,用于提高ap啟動(dòng)效率;
6.zygote完畢大部分工作拧略,接下來(lái)再通過(guò)startSystemServer()芦岂,fork system_server進(jìn)程。
最后調(diào)用runSelectLoop()垫蛆,隨時(shí)待命禽最,當(dāng)接收到請(qǐng)求創(chuàng)建新進(jìn)程請(qǐng)求時(shí)立即喚醒并執(zhí)行相應(yīng)工作。 -
startSystemServer()袱饭,fork system_server進(jìn)程川无,調(diào)用handleSystemServerProcess()方法執(zhí)行system_server的剩余工作:通用初始化、Zygote初始化和application初始化虑乖。
在application初始化中 初始化系統(tǒng)上下文懦趋、創(chuàng)建SystemServiceManager用于后面的binder機(jī)制,負(fù)責(zé)系統(tǒng)Service的啟動(dòng):如:AMS(ActivityManagerService)疹味、PackageManagerService等仅叫。最后調(diào)用Loop.loop(),進(jìn)入處理消息的循環(huán)
-
startSystemServer()袱饭,fork system_server進(jìn)程川无,調(diào)用handleSystemServerProcess()方法執(zhí)行system_server的剩余工作:通用初始化、Zygote初始化和application初始化虑乖。
- 在startOtherServices()其他服務(wù)中通過(guò)mActivityManagerService.systemReady()調(diào)用startHomeActivity來(lái)啟動(dòng)Launcher糙捺。Launcher中應(yīng)用圖標(biāo)顯示出來(lái):將LoaderTask作為消息發(fā)送給HandlerThread诫咱。run方法中調(diào)用loadAndBindWorkspace函數(shù)用來(lái)加載工作區(qū)信息--loadAndBindAllApps函數(shù)是用來(lái)加載系統(tǒng)已經(jīng)安裝的應(yīng)用程序信息。