A. 如何在Eclipse中查看android源碼或者第三方組件包源碼
android源碼需要在android sdk中下載才有的。
B. 怎麼用火狐瀏覽器查看網頁源代碼
准備工具/材料:裝有windows 10的電腦一台,火狐瀏覽器軟體。
用火狐瀏覽器查看網頁源代碼的辦法如下:
1、首先進入火狐瀏覽器瀏覽器首頁,點擊查看,如下圖所示。
C. 怎麼查看codeblocks的array源代碼
具體安裝步驟如下:
1、安裝必要組件
代碼:sudo apt-get install build-essential
代碼:sudo apt-get install gdb
2、更新源
代碼:gksudo gedit /etc/apt/sources.list
添加(以feisty為例):
代碼:sudo apt-key add key.asc
4、安裝最新 wxWidgets 庫
代碼:sudo apt-get update
代碼:
sudo apt-get install libwxgtk2.8-0 libwxgtk2.8-dev wx2.8-headers wx-common
5、設置 wxWidgets 默認版本
代碼:sudo update-alternatives --config wx-config
從列表中選擇一項即可。
(個人推薦選擇2)
6、與codeblocks相依賴的軟體包的安裝
(其中的dep是指的這個包的dev)
在這里要強調一點一定要安裝gtk2.0+這個開發包,要不會在後面的configure中遇到問題:
代碼
sudo apt-get install libgtk2.0-dev
以下就是所有的相關的依賴包,在這里不用安裝,如果在configure階段報錯找不到的時候,回來查閱進行安裝
libatk1.0-0 (>= 1.20.0)
The ATK accessibility toolkit
dep: libc6 (>= 2.4) [amd64]
GNU C 語言運行庫:共享庫
同時作為一個虛包由這些包填實: libc6-udeb
dep: libc6 (>= 2.7) [i386]
dep: libcairo2 (>= 1.6.0)
The Cairo 2D vector graphics library
dep: libcomerr2 (>= 1.01)
通用錯誤描述庫
dep: libcups2 (>= 1.3.8)
Common UNIX Printing System(tm) - libs
dep: libfontconfig1 (>= 2.4.0)
generic font configuration library - runtime
dep: libfreetype6 (>= 2.3.5)
FreeType 2 font engine, shared library files
dep: libglib2.0-0 (>= 2.18.0)
The GLib library of C routines
dep: libgnutls26 (>= 2.4.0-0)
GNU TLS 庫 - 運行時庫
dep: libgtk2.0-common
Common files for www.hbbz08.com the GTK+ graphical user interface library
dep: libjpeg62
The Independent JPEG Group's JPEG runtime library
dep: libkrb53 (>= 1.6.dfsg.2)
MIT Kerberos runtime libraries
dep: libpango1.0-0 (>= 1.21.6)
Layout and rendering of internationalized text
dep: libpng12-0 (>= 1.2.13-4)
PNG library - runtime
dep: libtiff4
Tag Image File Format (TIFF) library
dep: libx11-6
X11 client-side library
dep: libxcomposite1 (>= 1:0.3-1)
X11 Composite extension library
dep: libxcursor1 (>> 1.1.2)
X cursor management library
dep: libxdamage1 (>= 1:1.1)
X11 damaged region extension library
dep: libxext6
X11 miscellaneous extension library
dep: libxfixes3 (>= 1:4.0.1)
X11 miscellaneous 'fixes' extension library
dep: libxi6 (>= 2:1.1.3-1ubuntu3)
X11 Input extension library
D. 2021-02-03【技術】聊聊keep-alive組件的使用及其實現原理
keep-alive定義:
keep-alive是Vue.js的一個內置組件。它能夠不活動的組件實例保存在內存中,而不是直接將其銷毀,它是一個抽象組件,不會被渲染到真實DOM中,也不會出現在父組件鏈中。
它提供了include與exclude兩個屬性,允許組件有條件地進行緩存。
這里的component組件會被緩存起來。
舉個栗子
在點擊button時候,coma與comb兩個組件會發生切換,但是這時候這兩個組件的狀態會被緩存起來,比如說coma與comb組件中都有一個input標簽,那麼input標簽中的內容不會因為組件的切換而消失。
props
keep-alive組件提供了include與exclude兩個屬性來允許組件有條件地進行緩存,二者都可以用逗號分隔字元串、正則表達式或一個數組來表示。
include: 字元串或正則表達式。只有匹配的組件會被緩存。
exclude: 字元串或正則表達式。任何匹配的組件都不會被緩存。
keep-alive的聲明周期執行
頁面第一次進入,鉤子的觸發順序
created-> mounted-> activated,退出時觸發 deactivated
當再次進入(前進或者後退)時,只觸發 activated
事件掛載的方法等,只執行一次的放在 mounted 中;組件每次進去執行的方法放在 activated 中;
將緩存name為a的組件。
name為a的組件將不會被緩存。
注意:此處的name值是與在名稱為component組件中的name值對應的。
生命鉤子
keep-alive提供了兩個生命鉤子,分別是activated與deactivated。
被keepalive包含的組件不會被再次初始化,也就意味著不會重走生命周期函數
但是有時候是希望我們緩存的組件可以能夠再次進行渲染,這時 Vue 為我們解決了這個問題
被包含在 keep-alive 中創建的組件,會多出兩個生命周期的鉤子: activated 與 deactivated:
activated 當 keepalive 包含的組件再次渲染的時候觸發
deactivated 當 keepalive 包含的組件銷毀的時候觸發
keep-alive是一個抽象的組件,keep-alive會將組件保存在內存中,並不會銷毀以及重新創建,所以不會重新調用組件的created等方法,緩存的組件不會被 mounted,為此需要用activated與deactivated這兩個生命鉤子來得知當前組件是否處於活動狀態。
參數理解
keep-alive 可以接收3個屬性做為參數進行匹配對應的組件進行緩存:
include 包含的組件(可以為字元串,數組,以及正則表達式,只有匹配的組件會被緩存)
exclude 排除的組件(以為字元串,數組,以及正則表達式,任何匹配的組件都不會被緩存)
max 緩存組件的最大值(類型為字元或者數字,可以控制緩存組件的個數)
註:當使用正則表達式或者數組時,一定要使用 v-bind
遇見 vue-router 結合router使用,緩存部分頁面
所有路徑下的視圖組件都會被緩存
如果只想要router-view裡面的某個組件被緩存,怎麼辦?
1、使用 include/exclude
2、使用 meta 屬性
缺點:需要知道組件的 name,項目復雜的時候不是很好的選擇
優點:不需要例舉出需要被緩存組件名稱
使用$route.meta的keepAlive屬性:
需要在router中設置router的元信息meta:
說完了keep-alive組件的使用,我們從源碼角度看一下keep-alive組件究竟是如何實現組件的緩存的呢?
created鉤子會創建一個cache對象,用來作為緩存容器,保存vnode節點。
destroyed鉤子則在組件被銷毀的時候清除cache緩存中的所有組件實例。
假設這里有 3 個路由: A、B、C。
需求如下:
默認顯示 A
B 跳到 A,A 不刷新
C 跳到 A,A 刷新
實現方式如下:
在 A 路由裡面設置 meta 屬性:
在 B 組件裡面設置 beforeRouteLeave:
在 C 組件裡面設置 beforeRouteLeave:
這樣便能實現 B 回到 A,A 不刷新;而 C 回到 A 則刷新。
防坑指南
1.keep-alive 先匹配被包含組件的 name 欄位,如果 name 不可用,則匹配當前組件 components 配置中的注冊名稱。
2.keep-alive 不會在函數式組件中正常工作,因為它們沒有緩存實例。
3.當匹配條件同時在 include 與 exclude 存在時,以 exclude 優先順序最高(當前vue 2.4.2 version)。比如:包含於排除同時匹配到了組件A,那組件A不會被緩存。
4.包含在 keep-alive 中,但符合 exclude ,不會調用 activated 和 deactivated。
keep-alive生命周期鉤子函數:activated、deactivated
使用<keep-alive>會將數據保留在內存中,如果要在每次進入頁面的時候獲取最新的數據,需要在activated階段獲取數據,承擔原來created鉤子中獲取數據的任務。
附錄,題外話
生命周期函數:就是vue在某個時間段會自動執行的函數
1、beforeCreate(){}在執行的時候,data還有methods都沒有被初始化。
2、created(){} data還有methods都被初始化好了,如果要調用 methods 方法或者操作 data 裡面的數據,最早只能在 created 裡面進行操作。
3、beforeMount(){} 表示模板已經在內存中編輯完成了,但是尚未渲染到模板頁面中。即頁面中的元素,沒有被真正的替換過來,只是之前寫的一些模板字元串。
4、mounted(){} 表示內存中模板已經真實的掛載到頁面中去了,用戶可以看到渲染好的界面了
注意這是一個生命周期函數的最後一個函數了,執行完這個函數表示 整個vue實例已經初始化完成了,組件脫離了創建階段,進入運行階段。
下面是運行期間的兩個生命周期函數的鉤子:
5、beforeUpdate(){} 表示我們的界面還沒更新 但是data裡面的數據是最新的。即頁面尚未和最新的data裡面的數據保持同步。
6、update(){} 表示頁面和data裡面的數據已經包吃同步了 都是最新的。
7、beforeDestory(){} 當執行這個生命周期鉤子的時候 vue的實例從運行階段進入銷毀階段 此時實例身上的data 還有 methods處於可用的狀態。
8、Destoryed(){} 表示組件已經完全被銷毀了 組件中所有的實例方法都是不能用了
E. 「SpringCloud原理」Ribbon核心組件以及運行原理萬字源碼剖析
大家好,本文我將繼續來剖析SpringCloud中負載均衡組件Ribbon的源碼。本來我是打算接著OpenFeign動態代理生成文章直接講Feign是如何整合Ribbon的,但是文章寫了一半發現,如果不把Ribbon好好講清楚,那麼有些Ribbon的細節理解起來就很困難,所以我還是打算單獨寫一篇文章來剖析Ribbon的源碼,這樣在講Feign整合Ribbon的時候,我就不再贅述這些細節了。好了,話不多說,直接進入主題。
這是個很簡單的東西,就是服務實例數據的封裝,裡面封裝了服務實例的ip和埠之類的,一個服務有很多台機器,那就有很多個Server對象。
ServerList是個介面,泛型是Server,提供了兩個方法,都是獲取服務實例列表的,這兩個方法其實在很多實現類中實現是一樣的,沒什麼區別。這個介面很重要,因為這個介面就是Ribbon獲取服務數據的來源介面,Ribbon進行負載均衡的服務列表就是通過這個介面來的,那麼可以想一想是不是只要實現這個介面就可以給Ribbon提供服務數據了?事實的確如此,在SpringCloud中,eureka、nacos等注冊中心都實現了這個介面,都將注冊中心的服務實例數據提供給Ribbon,供Ribbon來進行負載均衡。
通過名字也可以知道,是用來更新服務注冊表的數據,他有唯一的實現,就是PollingServerListUpdater,這個類有一個核心的方法,就是start,我們來看一下start的實現。
通過這段方法我們可以看出,首先通過isActive.compareAndSet(false, true)來保證這個方法只會被調用一下,然後封裝了一個Runnable,這個Runnable幹了一件核心的事,就是調用傳入的updateAction的doUpdate方法,然後將Runnable扔到了帶定時調度功能的線程池,經過initialDelayMs(默認1s)時間後,會調用一次,之後都是每隔refreshIntervalMs(默認30s)調用一次Runnable的run方法,也就是調用updateAction的doUpdate方法。
所以這個類的核心作用就是每隔30s會調用一次傳入的updateAction的doUpdate方法的實現,記住這個結論。
IRule是負責負載均衡的演算法的,也就是真正實現負載均衡獲取一個服務實例就是這個介面的實現。比如說實現類RandomRule,就是從一堆服務實例中隨機選取一個服務實例。
就是一個配置介面,有個默認的實現DefaultClientConfigImpl,通過這個可以獲取到一些配置Ribbon的一些配置。
這個介面的作用,對外主要提供了獲取服務實例列表和選擇服務實例的功能。雖然對外主要提供獲取服務的功能,但是在實現的時候,主要是用來協調上面提到的各個核心組件的,使得他們能夠協調工作,從而實現對外提供獲取服務實例的功能。
這個介面的實現有好幾個實現類,但是我講兩個比較重要的。
BaseLoadBalancer
核心屬性
allServerList:緩存了所有的服務實例數據
upServerList:緩存了能夠使用的服務實例數據。
rule:負載均衡演算法組件,默認是RoundRobinRule
核心方法
setRule:這個方法是設置負載均衡演算法的,並將當前這個ILoadBalancer對象設置給IRule,從這可以得出一個結論,IRule進行負載均衡的服務實例列表是通過ILoadBalancer獲取的,也就是 IRule 和 ILoadBalancer相互引用。setRule(rule)一般是在構造對象的時候會調用。
chooseServer:就是選擇一個服務實例,是委派給IRule的choose方法來實現服務實例的選擇。
BaseLoadBalancer這個實現類總體來說,已經實現了ILoadBalancer的功能的,所以這個已經基本滿足使用了。
說完BaseLoadBalancer這個實現類,接下來說一下DynamicServerListLoadBalancer實現類。DynamicServerListLoadBalancer繼承自BaseLoadBalancer,DynamicServerListLoadBalancer主要是對BaseLoadBalancer功能進行擴展。
DynamicServerListLoadBalancer
成員變數
serverListImpl:上面說過,通過這個介面獲取服務列表
filter:起到過濾的作用,一般不care
updateAction:是個匿名內部類,實現了doUpdate方法,會調用updateListOfServers方法
serverListUpdater:上面說到過,默認就是唯一的實現類PollingServerListUpdater,也就是每個30s就會調用傳入的updateAction的doUpdate方法。
這不是巧了么,serverListUpdater的start方法需要一個updateAction,剛剛好成員變數有個updateAction的匿名內部類的實現,所以serverListUpdater的start方法傳入的updateAction的實現其實就是這個匿名內部類。
那麼哪裡調用了serverListUpdater的start方法傳入了updateAction呢?是在構造的時候調用的,具體的調用鏈路是調用 restOfInit -> (),這里就不貼源碼了
所以,其實DynamicServerListLoadBalancer在構造完成之後,默認每隔30s中,就會調用updateAction的匿名內部類的doUpdate方法,從而會調用updateListOfServers。所以我們來看一看 updateListOfServers 方法幹了什麼。
這個方法實現很簡單,就是通過調用 ServerList 的getUpdatedListOfServers獲取到一批服務實例數據,然後過濾一下,最後調用updateAllServerList方法,進入updateAllServerList方法。
其實很簡單,就是調用每個服務實例的setAlive方法,將isAliveFlag設置成true,然後調用setServersList。setServersList這個方法的主要作用是將服務實例更新到內部的緩存中,也就是上面提到的allServerList和upServerList,這里就不貼源碼了。
其實分析完updateListOfServers方法之後,再結合上面源碼的分析,我們可以清楚的得出一個結論,那就是默認每隔30s都會重新通過ServerList組件獲取到服務實例數據,然後更新到BaseLoadBalancer緩存中,IRule的負載均衡所需的服務實例數據,就是這個內部緩存。
從DynamicServerListLoadBalancer的命名也可以看出,他相對於父類BaseLoadBalancer而言,提供了動態更新內部服務實例列表的功能。
為了便於大家記憶,我畫一張圖來描述這些組件的關系以及是如何運作的。
說完一些核心的組件,以及他們跟ILoadBalancer的關系之後,接下來就來分析一下,ILoadBalancer是在ribbon中是如何使用的。
ILoadBalancer是一個可以獲取到服務實例數據的組件,那麼服務實例跟什麼有關,那麼肯定是跟請求有關,所以在Ribbon中有這么一個抽象類,,這個是用來執行請求的,我們來看一下這個類的構造。
通過上面可以看出,在構造的時候需要傳入一個ILoadBalancer。
中有一個方法executeWithLoadBalancer,這個是用來執行傳入的請求,以負載均衡的方式。
這個方法構建了一個LoadBalancerCommand,隨後調用了submit方法,傳入了一個匿名內部類,這個匿名內部類中有這么一行代碼很重要。
這行代碼是根據給定的一個Server重構了URI,這是什麼意思呢?舉個例子,在OpenFeign那一篇文章我說過,會根據服務名拼接出類似 http:// ServerA 的地址,那時是沒有伺服器的ip地址的,只有服務名,假設請求的地址是 http:// ServerA/api/sayHello ,那麼reconstructURIWithServer乾的一件事就是將ServerA服務名替換成真正的服務所在的機器的ip和埠,假設ServerA所在的一台機器(Server裡面封裝了某台機器的ip和埠)是192.168.1.101:8088,那麼重構後的地址就變成 http:// 192.168.1.101:8088/api/ sayHello ,這樣就能發送http請求到ServerA服務所對應的一台伺服器了。
之後根據新的地址,調用這個類中的execute方法來執行請求,execute方法是個抽象方法,也就是交給子類實現,子類就可以通過實現這個方法,來發送http請求,實現rpc調用。
那麼這台Server是從獲取的呢?其實猜猜也知道,肯定是通過ILoadBalancer獲取的,因為submit方法比較長,這里我直接貼出submit方法中核心的一部分代碼
就是通過selectServer來選擇一個Server的,selectServer我就不翻源碼了,其實最終還是調用ILoadBalancer的方法chooseServer方法來獲取一個服務,之後就會調用上面的說的匿名內部類的方法,重構URI,然後再交由子類的execut方法來實現發送http請求。
所以,通過對的executeWithLoadBalancer方法,我們可以知道,這個抽象類的主要作用就是通過負載均衡演算法,找到一個合適的Server,然後將你傳入的請求路徑 http:// ServerA/api/sayHello 重新構建成類似 http:// 192.168.1.101:8088/api/ sayHello 這樣,之後調用子類實現的execut方法,來發送http請求,就是這么簡單。
到這里其實Ribbon核心組件和執行原理我就已經說的差不多了,再來畫一張圖總結一下
說完了Ribbon的一些核心組件和執行原理之後,我們再來看一下在SpringCloud環境下,這些組件到底是用的哪些實現,畢竟有寫時介面,有的是抽象類。
Ribbon的自動裝配類:RibbonAutoConfiguration,我拎出了核心的源碼
RibbonAutoConfiguration配置類上有個@RibbonClients註解,接下來講解一下這個註解的作用
SpringClientFactory是不是感覺跟OpenFeign中的FeignContext很像,其實兩個的作用是一樣的,SpringClientFactory也繼承了NamedContextFactory,實現了配置隔離,同時也在構造方法中傳入了每個容器默認的配置類RibbonClientConfiguration。至於什麼是配置隔離,我在OpenFeign那篇文章說過,不清楚的小夥伴可以後台回復feign01即可獲得文章鏈接。
配置優先順序問題
優先順序最低的就是FeignContext和SpringClientFactory構造時傳入的配置類
至於優先順序怎麼來的,其實是在NamedContextFactory中createContext方法中構建時按照配置的優先順序一個一個傳進去的。
RibbonClientConfiguration提供的默認的bean
接下來我們看一下RibbonClientConfiguration都提供了哪些默認的bean
配置類對應的bean,這里設置了ConnectTimeout和ReadTimeout都是1s中。
IRule,默認是ZoneAvoidanceRule,這個Rule帶有過濾的功能,過濾哪些不可用的分區的服務(這個過濾可以不用care),過濾成功之後,繼續採用線性輪詢的方式從過濾結果中選擇一個出來。至於這個propertiesFactory,可以不用管,這個是默認讀配置文件的中的配置,一般不設置,後面看到都不用care。
至於為什麼容器選擇NacosServerList而不是ConfigurationBasedServerList,主要是因為這個配置類是通過@RibbonClients導入的,也就是比SpringClientFactory導入的RibbonClientConfiguration配置類優先順序高。
ServerListUpdater,就是我們剖析的PollingServerListUpdater,默認30s更新一次BaseLoadBalancer內部服務的緩存。
那麼在springcloud中,上圖就可以加上注冊中心。
三、總結
本文剖析了Ribbon這個負載均衡組件中的一些核心組件的源碼,並且將這些組件之間的關系一一描述清楚,同時也剖析了在發送請求的時候是如何通過ILoadBalancer獲取到一個服務實例,重構URI的過程。希望本篇文章能夠讓你知道Ribbon是如何工作的。
F. 易語言怎麼查看已編輯程序的全部源碼(包含對話框編輯框等的設定語句)
在程序的窗口界面按住滑鼠左鍵拖出一個框選中全部組件(和選擇一定區域的文件一個道理)然後右鍵復制,到新程序的空白窗口在粘貼,調整下位置,就全部復制過來了,程序集也一定要復制進對應的程序集哦~
以及查看組件的屬性是在窗口裡面直接編輯的,除非需要變化否則應該不會在程序集裡面出現
G. 如何在Eclipse中查看JDK類庫的源代碼 (轉載)
1.點 「window」-> "Preferences" -> "java" -> "Installed JRES"
2.此時"Installed JRES"右邊是列表窗格,列出了系統中的 JRE 環境,選擇你的JRE,然後點邊上的 "Edit...", 會出現一個窗口(Edit JRE)
3.選中rt.jar文件的這一項:「c:program filesjavajre_1.5.0_06lib
t.jar」
點 左邊的「+」 號展開它,
4.展開後,可以看到「Source Attachment:(none)」,點這一項,點右邊的按鈕「Source Attachment...」, 選擇你的JDK目錄下的 「src.zip」文件
5.一路點"ok",結束。
dt.jar是關於運行環境的類庫,主要是swing的包
tools.jar是關於一些工具的類庫
rt.jar包含了jdk的基礎類庫,也就是你在java doc裡面看到的所有的類的class文件
H. 如何在Eclipse中查看Android源碼或者第三方組件包源碼
1、用Eclipse查看,安卓實現源碼時,會出現如下錯誤,Source not found,這是選擇的開發包出錯,或者,沒有改函數的實現,一般都會有的,所以,大多是,選擇的 SDK出現錯誤。這時候,你要找到,android包所在目錄,最新Eclipse和以往的Eclipse有所差異。 2、點擊按鈕,點擊,External Folder選擇,sdk所在的文件件,大家注意地址的,選擇,一定不能錯。 3、出現,如圖所示,operation in progress.....說明,成功了。
I. 怎麼在windows下查看android源碼
如何查看Android源碼[以Android2.2為例]
我們知道在Eclipse里按住Ctrl鍵不鬆手在某個類上點擊滑鼠左鍵,可以跳轉到該類的文件。如果沒有源碼就會跳到class文件上。因此我們只需要把源碼拷貝到合適位置,Eclipse就可以找到源碼了。接下來我說一下步驟:
把android-2.2-froyo-src.zip源碼下載下來,[解壓後]放在Android
SDK的指定目錄下,在我機器上的目錄是:C:/AndroidSDK/android-sdk-windows/platforms/android-
8/sources,其中sources目錄是自己建的。解壓後的情況應該是這樣的:
在Javadoc For 'ormlite-android-4.22.jar'屬性框中點擊Browse按鈕來選擇幫助文檔包,然後點擊OK按鈕。
第四:經過以上的操作步驟,就完成了對第三方組件源碼的添加設置以及幫助文檔的添加和設置。這樣就可以和查看Android源碼一樣可以查看第三方組件的源碼了,同時在Eclipse中把游標定位到某個類,按F1鍵就可以查看相應的幫助文檔了。對ormlite-core-4.22.jar的操作也是一樣。