當前位置:首頁 » 操作系統 » 第九源碼

第九源碼

發布時間: 2023-02-06 01:47:00

㈠ 通過手機點了這個鏈接之後可以跳轉到微信支付,這個源碼怎麼寫

微信公司平台帳號注冊後官方首頁很簡單,沒有導航欄目頁面新建等功能。需要通過三方軟體與微信介面做二次開發。首先要在現在微信開個介面,這是要工商局認證的。

㈡ 易語言怎麼編寫遠程式控制制啊像灰鴿子的那種!最好有源代碼!

gh0st遠控軟體採用驅動級RESSDT過主動,svchost參數啟動,替換系統服務的方式工作的,工作方式較為先進,美中不足的部分是沒有進行驅動級或用戶級隱藏,當然這部分可以添加進去。編碼利用了VC的編程環境。
一、環境配置
編譯環境一定要配置好:DDK+SDK+VC6,DDK用來編譯sys文件的,SDK+VC6是用來編譯工程的,配置部分比較簡單,網上有很多資料,這里不再詳述,有興趣的朋友也可以查看DDK和SDK的相關幫助。
二、特徵碼定位簡述
殺毒軟體查殺木馬的原理基本是根據特徵查殺的,被查殺的部分我們稱之為特徵碼,所以我們可以利用特徵碼定位工具MyCLL定位出病毒的特徵碼位置,定位工具原理是將被掃描木馬分塊,利用分段填充的方式,匹配殺軟的特徵值,找到殺軟查殺病毒的位置。
定位出特徵碼,如何反向找到源碼中的對應位置呢?請看下面分析,
三、二進制文件與源碼定位之map文件利用
map文件是二進制和源碼之間對應的一個映射文件。
我們假設根據第三步我們定位出了病毒的特徵碼:
病毒名稱 特徵碼位置 內存地址
svchost.dll 000038AA_00000002 100044AA
svchost.dll 00005F98_00000002
第一步設置VC編譯環境生成Map文件。
在 VC 中,點擊菜單「Project -> Settings」選項頁(或按下 Alt+F7),選擇 C/C++ 選項卡,並在最下面的 Project Options 裡面輸入:/Zd ,然後要點擊 Link 選項卡,選中「Generate mapfile」復選框,並在最下面的 Project Options 裡面輸入:/mapinfo:lines,表示生成 MAP 文件時,加入行信息。設置完成。
第二步編譯VC工程,設置活動工程編譯即可,這個不用說明。這個步驟完成後,在release(或debug)目錄,多了一個.map文件(比如svchost.map)。
第三步打開map文件(用UE或文本編輯器打開都行),形式如下:
(begin)
Timestamp is 488fcef2 (Wed Jul 30 10:16:18 2008)
Preferred load address is 10000000
---------------------------------------------------------------------------1----(為方便說明,wrw添加)
Start Length Name Class
0001:00000000 00010a50H .text CODE
0001:00010a50 00000485H .text$x CODE
0002:00000000 000004c8H .idata$5 DATA
......
0003:00000010 00000004H .CRT$XIZ DATA
0003:00000020 00001a50H .data DATA
0003:00001a70 00000688H .bss DATA
0004:00000000 000000a8H .rsrc$01 DATA
0004:000000b0 00000cf0H .rsrc$02 DATA
----------------------------------------------------------------------------2---(為方便說明,wrw添加)
Address Publics by Value Rva+Base Lib:Object
0001:00000000 ??0CAudio@@QAE@XZ 10001000 f Audio.obj
0001:000000d0 ??_GCAudio@@UAEPAXI@Z 100010d0 f i Audio.obj
0001:000000d0 ??_ECAudio@@UAEPAXI@Z 100010d0 f i Audio.obj
0001:000000f0 ??1CAudio@@UAE@XZ 100010f0 f Audio.obj
0001:000001e0 ?getRecordBuffer@CAudio@@QAEPAEPAK@Z 100011e0 f Audio.obj
0001:00000240 ?playBuffer@CAudio@@QAE_NPAEK@Z 10001240 f Audio.obj
0001:000002c0 ?InitializeWaveIn@CAudio@@AAE_NXZ 100012c0 f Audio.obj
......
0001:00003310 ?SendToken@CFileManager@@AAEHE@Z 10004310 f FileManager.obj
0001:00003320 ?UploadToRemote@CFileManager@@AAE_NPAE@Z 10004320 f FileManager.obj
0001:00003440 ?FixedUploadList@CFileManager@@AAE_NPBD@Z 10004440 f FileManager.obj
0001:00003670 ?StopTransfer@CFileManager@@AAEXXZ 10004670 f FileManager.obj
0001:00003730 ?CreateLocalRecvFile@CFileManager@@AAEXPAE@Z 10004730 f FileManager.obj
......
----------------------------------------------------------------------------3---(為方便說明,wrw添加)
Line numbers for .\Release\FileManager.obj(E:\vtmp\gh0st3src\Server\svchost\common\FileManager.cpp) segment .text
17 0001:00002630 20 0001:0000267f 21 0001:00002698 24 0001:000026d0
25 0001:000026f8 26 0001:0000273c 29 0001:000027d0 33 0001:000027ee
77 0001:000027f8 36 0001:000027fb 37 0001:00002803 77 0001:0000280d
......
532 0001:0000340f 534 0001:00003414 537 0001:00003428 540 0001:00003440
546 0001:0000345d 547 0001:00003487 548 0001:00003490 549 0001:00003492
551 0001:0000349e 552 0001:000034b8 553 0001:000034cb 554 0001:000034d4
558 0001:000034de 560 0001:000034e9 563 0001:000034ee 564 0001:00003506
......
(end)
我們看下,定位svchost.dll 的第一個特徵碼內存地址為:100044AA,在第2塊中,我們可以找到RVA+BASE與之很接近的是
0001:00003440 ?FixedUploadList@CFileManager@@AAE_NPBD@Z 10004440 f FileManager.obj
這樣我們可以定位到FileManager.cpp中的FixedUploadList函數,是不是范圍縮小了?
下面我們再縮小代碼行
利用這個公式:特徵碼行偏移 = 特徵碼地址(Crash Address)- 基地址(ImageBase Address)- 0x1000
看起來好像很難,其實很簡單,我們將100044AA去掉內存基址10000000,再減1000,因為PE很多從1000開始,可以得到代碼偏移地址為34AA。到第3塊中找對應的代碼行。
偏移地址34AA在(551 0001:0000349e 552 0001:000034b8 )中間,也就是551行和552行中間,我們到源程序中查找第551行:
wsprintf(lpszFilter, "%s%s*.*", lpPathName, lpszSlash);
這樣就定位出源代碼了,要怎麼修改就怎麼修改它就可以了。
四、實戰免殺
A、卡巴免殺
首次編譯後,先做卡巴的免殺。卡巴殺sys文件和dll,當然也就殺包裝它們的install.exe,最後卡巴還殺生成的sever,我這里說殺生成好的server不是和前面的特徵碼重疊的地方,而是殺配置信息。
第一步、sys免殺
sys重新編譯後,增加了輸入表的函數,同時系統不同,造成很多地方不同於原特徵,順利通過卡巴、金山、小紅傘等殺軟。
第二步、svchost.dll免殺
特徵碼定位MultiByteToWideChar和"gh0st update"兩個位置。這里是通過第3步map文件得出的。
卡巴怕加花指令, 這個函數MultiByteToWideChar的調用上,可以在這個函數前面隨便加幾句無效語句就可以通過卡巴殺軟。
字元串調用"gh0st update" ,這個是用於更新用的 ,如果不要在線更新,直接把這個語句所在代碼塊刪除;嘿嘿,其實搜索工程替換這個字元串為其他的字元串就可以了^_^,這個方法同時可以過金山殺軟。
第三步、server免殺
卡巴定位在最後的配置信息,採取跳轉顯然是不行的,採用加花的辦法,在寫入AAAAAA配置信息之前,隨便寫些東西,就可以做server免殺。
卡巴免殺完成!
B、Avast免殺
最新的avast殺軟再查殺1下,殺install.exe和svchost.dll(也就是殺生成的文件和其中的資源文件),接著做它的源碼免殺。
定位在特徵字元串%02d/%02d/%02d和「SYSTEM\CurrentControlSet\Services\%s」兩個地方。
解決方案:
1、svchost.dll的特徵碼定位在鍵盤記錄KeyboardManager.cpp文件中的SaveInfo(char *lpBuffer)函數。特徵字元串%02d/%02d/%02d,也就是我們看到鍵盤記錄的日期,修改之,修改的方法很多,將其改為[%d/%d/%d %d:%d:%d] ,編譯即可通過avast殺軟。
2、install的特徵碼定位在「SYSTEM\CurrentControlSet\Services\%s」,對應文件是install.cpp里的InstallService函數,修改大小寫,編譯即可通過免殺。

五、添加垃圾代碼的小方法
垃圾代碼要移動特徵碼所在的位置,不要跑到堆棧中了,這樣的代碼沒有用。可以採取添加for循環,做計數,簡單統計,採用局部變數,不改變後面的邏輯為宜。
添加輸出表的方法:
有殺輸出表的,可以在生成的svchost.dll上添加空函數 ,但是每次編譯都要修改1次資源 ,其實我們在源碼上添加如下語句:
extern "C" __declspec(dllexport) bool JustTempFun();//聲明
……
extern "C" __declspec(dllexport) bool JustTempFun() //實現
{
return false;
}
編譯後,輸出表就被改變了,有的殺軟就可做到代碼免殺。

六、gh0st自動生成6to4ex.dll的修改
看到好多站友提問自動生成6to4ex.dll的問題,有熱心站友也提出了自己的見解 ,我感覺有些人提出的解決方案不完全正確,有可能造成剛入手人誤解,我根據自己的理解說明1下。
gh0st服務端是通svchost -netsvcs啟動的,所以程序要利用netsvcs 服務,服務端也就是根據netsvcs生成的,故不能說服務端生成是隨機的,相對於大多數系統來講,基本是固定的,下面看分析。
查看install.cpp裡面的InstallService()方法,首先遍歷HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows NT\CurrentVersion\Svchost中的服務項,查找到一個服務後,程序採取替換服務的方法,將原服務刪除,然後生成對應服務項+ ex.dll的文件替換原服務,6to4服務一般排在第一位,6to4服務是一種自動構造隧道的方式,作用在於只需要一個全球惟一的IPv4地址便可使得整個站點獲得IPv6 的連接,這個服務對一般人來講,基本閑置,所以我們的程序就把6to4服務給替換掉,同時在windows\system32\目錄下生成 6to4ex.dll,以後啟動就是6to4ex了,如果把這個服務跳過去,就依次向下生成Ias、Iprip等服務啦,如果netsvcs項沒有可以替換的服務,則程序將自己添加1個服務,名稱就是由 AddsvchostService()方法產生的netsvcs_0x%d。
這樣說不知道關心服務名稱的明白了不?
這個不能說是技術問題,但是小技巧問題可以從這里產生,我不知道其他人的360是怎麼過的,但是我覺得可以提示1下的是,如果是360默認系統安全的服務,它肯定不會報不安全,替換閑置的系統安全的服務則通過360的效果要好的多
本文來自: 華夏黑客同盟論壇 本文詳細地址:http://bbs.77169.com/read.php?tid=255676

㈢ 球推薦幾部類似《時空罪惡》和《土撥鼠之日》的循環穿越的電影

第一部《恐怖游輪》

單親母親傑西(梅利莎·喬治 飾)和一幫朋友乘遊艇出海遊玩,但她總有一種有不好的事情發生的感覺。不久,他們便在海上遭遇一場強烈的風暴。遊艇翻船,眾人落海,幾經掙扎他們好不容易爬到遊艇殘骸上來。正當他們無計可施之時,一艘巨大的游輪向眾人緩緩駛來。眾人欣喜過望,未加思索便登上這艘名為「艾俄洛斯」的游輪,結果發現這竟是一艘1930年便告失蹤的神秘之船,而船上更是空無一人。隨處可見的鮮血、神秘的指示以及突如其來的兇殺事件,將這群男女帶入萬劫不復的恐怖輪回之中。
第二部《黑桐頻率》

約翰的父親弗蘭克(丹尼斯•奎德 Dennis Quaid 飾)死於30年前一次救火行動中。一次,翻看父親的遺物時,約翰(詹姆斯•卡維澤 James Caviezel 飾)發現了30年前父親使用過的一台老式無線電。在隨手翻撥頻段的時候,他竟然和一名年輕叫弗蘭克的男子搭上了線。經過整夜長談,約翰確定時空發生了錯亂,這個弗蘭克正是自己30年前的父親。約翰興奮異常,順利幫助父親躲過了30年前的那場災難。當他一覺醒來,驚訝地發現了相框中白發蒼蒼的父親,他知道自己成功了。然而讓人意想不到的是,歷史一切都改寫。約翰的拯救了父親,而他的母親卻死於了多年前的一起連環殺人案。當約翰通過無線電再次聯系30年前的父親,意圖讓父親阻止母親被殺時,父親卻又意外成了嫌疑犯!
第三部《蝴蝶效應》

伊萬(艾什頓·庫奇 Ashton Kutcher 飾)曾經有一個糟糕的童年,因為他行為闖下了大禍,令他童年充滿不堪回憶的往事。而事實上,他確實只是依稀記得一點可怕的情景,這些情景一直糾纏著他的正常生活。伊萬接受心理學家建議,把瑣碎生活記在記事本里,卻偶然發現通過記事本回到過去。這時他才清楚記起,童年時候的自己做了那麼多的錯事。他幻想著用現在的意識,潛入童年的身體,去彌補種種過失給人們帶來的傷害,尤其是希望與當年暗戀的凱西最終走回一起。然而他一次次的跨越時空的更改,只能越來越招致現實世界的不可救葯。一切就像蝴蝶效應般,牽一發而動全身。
第四部《超時空罪惡》

中年男子海克特(Karra Elejalde 飾)和妻子克萊拉(Candela Fernández 飾)搬到郊外一幢別墅居住,他用望遠鏡觀察四周的景物,卻意外看到一個正脫去衣衫的妙齡女子。海克特心感疑惑,決定前往女子出現的灌木叢中查看一番,結果遭到一個手持尖刀、全身纏滿綳帶的男子的追殺。海克特倉皇之中逃入一所空曠的實驗室內,並在其中的大水槽內躲了起來。次日,當海克爾回到家時,卻看到另一個自己正和妻子搬傢具,他不知不覺穿越時空來到了一天前。原來水槽是一個時空機器,海克特的命運無意間發生了改變。
第五部《12隻猴子》

公元2035年,人類被12隻猴子軍研製的一種病毒侵襲,大部分人類都在這場病毒災難中死亡,只有少數人僥幸逃生,但也只能在陰暗的地下,苟且偷生。科學家們決定派人穿越時光回到1996年追查12隻猴子軍的來歷。囚徒詹姆斯·科爾(布魯斯·威利斯 Bruce Willis 飾)被 挑選為志願者。陰差陽錯,科爾回到了1990年,當他向當時的人們描述未來的那場大災難時,被當作精神病捉了起來並被醫生凱瑟琳·雪莉(瑪德琳·斯通 Madeleine Stowe 飾)診斷為精神分裂症。科爾在病友傑弗里·戈因斯幫助下逃脫,回到了未來。因為沒查清12隻猴子軍的來歷,科爾再次被派回了1996年。科爾這次發現了12隻猴子軍的起源地在費城,他找到了醫生凱瑟琳,二人一起展開了追查12隻猴子軍的冒險之旅!
第六部《土撥鼠之日》

菲爾(Bill Murray飾)是個氣象播報員,每天除了在攝像機前給觀眾做風趣幽默的天氣預報外,每年的2月2日他還要前往一個名為普蘇塔尼的邊境小鎮,報導當地的土撥鼠日慶典。事實上,菲爾對這一節日相當嗤之以鼻並開始對工作感到厭倦,當他例行公事完成今年的報導後,便急不可待地想重返家園,卻因為一場突如其來的暴風雪耽擱了。第2天醒來後,菲爾意外地發現時間仍然停留在前一天土撥鼠日,昨日的一切重新上演。驚訝、不信、刺激、狂喜、煩悶、焦慮、不安、絕望、倦怠等各種情緒輪流侵佔菲爾的感官領域,可無論他如何選擇度過這一天,他都始終無法再前進一步,開始了他重復的人生。
第七部《羅拉快跑》

羅拉(弗蘭卡•波滕特 飾)和曼尼(莫里茲•克雷多 飾)是一對年輕的戀人,其中曼尼是一個不務正業的小混混,而羅拉則是相信「天大的事情有愛情頂著」的愛情至上主義者。一天,曼尼為老大完成一項鑽石交易,帶著裝有10萬馬克的錢袋等候羅拉的接應,然而羅拉的自行車被人搶走,耽誤了約定的接應時間,曼尼只好乘地鐵回去。在地鐵車廂里,曼尼扶起身邊的乞丐,同時,看見兩名警察向他走來。慌亂中,曼尼下了車,竟然把錢袋忘在了車廂里。顯然,錢袋被乞丐拿走了。此時距離曼尼和老大約定見面交錢的時間只剩下20分鍾,如果20分鍾之內籌集不到10萬馬克,曼尼就會被老大殺死。走投無路的曼尼打電話向羅拉求救,如果羅拉20分鍾之內不能趕到,曼尼只能鋌而走險搶劫電話亭對面的超市。考驗羅拉愛情的時候到了,為了在20分鍾內籌到10萬馬克,救出曼尼,她狂奔在向銀行家父親求助的路上。
第八部《環形使者》

未來,2044年。時間旅行從被發明的一開始就屬於非法,只有當黑幫組織想清理某個特定對象、又不願意在此世界留下任何痕跡時,才會出動「環形使者」。他們專門負責處決那些被時間傳送回彼世界的目標。之所以稱為「環形使者」,因為他們最終必須殺死未來的自己——這樣才不會給未來主顧留下任何的麻煩。這個過程被稱為「封環」。殺手喬(約瑟夫·高登-萊維特 Joseph Gordon-Levitt 飾)是最年輕的環形使者,彈無虛發,然而當他想處決來自未來的自己(布魯斯·威利斯 Bruce Willis 飾)時,卻遭到激烈反抗而失手。老年喬希望殺死未來封環計劃中的關鍵人物——喚雨師,從而改變妻子(許晴 飾)的命運;青年喬在追殺過程中遇到了農場單親媽媽莎拉(艾米莉·布朗特 Emily Blunt 飾),意外的成為了一對母子的保護人。兩個版本的喬在這場改變未來(和現在)的豪賭中各出奇謀,上演了自我的巔峰對決。
第九部《源代碼》

在阿富汗執行任務的美國空軍飛行員科特史蒂文斯上尉(傑克·吉倫哈爾 Jake Gyllenhaal 飾)突然驚醒,發現自己在一輛高速行駛的列車上,而他的身邊坐著一個素不相識的女子克里斯蒂安(米歇爾·莫娜漢 Michelle Monaghan 飾)正在與自己講話。科爾不知自己為什麼會在這輛車上,而且他發現自己居然是以另一個人的身份存在,正當他迷惑不解的時候,列車上忽然發生爆炸。科特又一次驚醒,發現自己身處一個密閉的太空倉里,有一位女軍官古德溫(維拉·法米加 Vera Farmiga 飾)正在通過視頻和自己對話,並要求自己報告列車上發生的事情。一頭霧水的科特還沒搞明白是怎麼回事時,他又一次被送上那輛列車。這次之後,科特終於明白自己在執行一件任務,負責調察芝加哥火車爆炸案找到恐怖份子並查出他的下一個目標。科特被一次又一次的送上那輛高速列車,每次只有八分鍾的時間調察,調察過程中,科特發現自己已在一周前去世,原來他正在參與是一項「腦波原代碼」的秘密任務,這項任務通過已經死亡的科特尚未完全死亡的腦細胞影像來還原事件,調查事情的真相。最終,科特順利完成了任務,但是他卻決定再一次返回列車,拯救列車上那些無辜的生命。
第十部《明日邊緣》

未來世界陷入外星人入侵的恐慌中,軍事演說家凱奇少校(湯姆·克魯斯 Tom Cruise 飾)畏懼上戰場,他從沒想過將軍(布萊丹·格里森 Brendan Gleeson 飾)會讓他去指揮即將開始的「諾曼底戰役」,拒絕接受命令之後將軍居然惡整了他,那就是把他當做逃兵扔進了軍 營中。凱奇被歸入了J小隊中進行戰斗,戰役的第一天就慘死在戰場,沒想到這一死讓他擁有了時空循環的能力,而唯一相信他的人就是被稱為「全金屬戰士」的麗塔·沃拉塔斯基(艾米莉·布朗特 Emily Blunt 飾)。二人開始了時空循環作戰,在訓練凱奇的同時他們發現了控制時間的奧秘,這與外星人「主腦」歐米茄有關,但是唯一能取得勝利的方法就是讓凱奇不斷死去、不斷重啟時間。在不斷重復登陸那天的戰斗的同時,凱奇越來越不想失去麗塔。

㈣ html怎麼源碼自動格式化

首先在[編輯]|[首先參數]的"代碼格式"中設置好格式:

第一行:勾選.可以選擇使用Tab鍵或空格鍵填補縮進.
第二行:Tab鍵所佔空位.這個只在DreamWeaver中有影響.不管你設為幾,在文件中,一個Tab鍵還是一個Tab鍵.
第三行:是否自動換行.不選.
第四行:換行符類型.(Windows)
第五、六、七行:標簽大小寫.
第八行:TD後無換行.不勾選.
第九行:居中方式.
設置好以後,點確定.然後轉到菜單:[命令]|[應用源格式] -----看看源代碼,已經整整齊齊了!

㈤ 學生成績管理系統 用C語言編寫的 原代碼

C語言課程設計任務書
一、題目: 學生成績管理
二、目的與要求
1. 目的:
(1)基本掌握面向過程程序設計的基本思路和方法;
(2)達到熟練掌握C語言的基本知識和技能;
(3)能夠利用所學的基本知識和技能,解決簡單的程序設計問題
2. 要求
基本要求:
1. 要求利用C語言面向過程的編程思想來完成系統的設計;
2. 突出C語言的函數特徵,以多個函數實現每一個子功能;
3. 畫出功能模塊圖;
4. 進行簡單界面設計,能夠實現友好的交互;
5. 具有清晰的程序流程圖和數據結構的詳細定義;
6. 熟練掌握C語言對文件的各種操作。
創新要求:
在基本要求達到後,可進行創新設計,如系統用戶功能控制,對管理員級和一般級別的用戶系統功能操作不同
三、信息描述
輸入一個班10個學生的學號和每個學生考試三門功課(數學、英語、計算機基礎)的成績。編程計算出每個學生的總分和平均分,並按學生成績優劣排序,最後列印一張按高分到低分名次排序的成績單。要求:
1)排序用一個函數實現。
2)列印的成績單表項包括:序號,學號、數學、英語、計算機、總分、平均分。
3)按實驗報告電子模板格式填寫實驗內容。
四、功能描述
1. 學生基本信息及成績所選科目成績的錄入。
2. 基本信息的查詢(分系、班級;分科目)與修改。
3. 對每系或每班各科成績進行分析(即求單科平均成績、及格率和優秀率);
4. 對所開課程的成績分析(求其平均成績,最高分和最低分);
5. 對學生考試成績進行排名(單科按系別或班級進行排名,對每一個班級,同一學期學生總體成績進行排名,並顯示各科成績信息)
五. 程序源代碼
#include <stdio.h>
#include <stdlib.h>
#define STU_NUM 10 /*宏定義學生的數量*/
struct student /*定義一個結構體用來存放學生學號、三門課成績、總分及平均成績*/
{
char stu_id[20]; /*學生學號;*/
float score[3]; /*三門課成績;*/
float total; /*總成績;*/
float aver; /*平均成績;*/
};
/*排序用一個函數來實現*/
void SortScore(student *stu,int n)
{
student stud;
for(int i = 0; i < n-1; i++)
for(int j = i+1 ; j < n; j++)
{
if(stu[i].total < stu[j].total)
{
stud = stu[i];
stu[i] = stu[j];
stu[j] = stud;
}
}
}
int main( )
{
student stu[STU_NUM]; /*創建結構體數組中有10個元素,分別用來保存這10個人的相關信息。*/
/*輸入這十個學生的相關信息*/
for(int i = 0; i<STU_NUM; i++)
{
printf("請輸入第%d個學生的學號:",i+1);
scanf("%s",&stu[i].stu_id);
printf("輸入第%d個學生的數學成績:",i+1);
scanf("%f",&stu[i].score[0]);
printf("輸入第%d個學生的英語成績:",i+1);
scanf("%f",&stu[i].score[1]);
printf("輸入第%d個學生的計算機成績:",i+1);
scanf("%f",&stu[i].score[2]);
stu[i].total = stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
stu[i].aver = stu[i].total/3;
}
printf("\n");

SortScore(stu,STU_NUM);/*調用排序函數*/
/*輸出排序後的各學生的成績*/
for(i = 0 ; i < STU_NUM; i++)
{
printf("序號: %d\t",i);
printf("學號:%s\t",stu[i].stu_id);
printf("數學:%f\t",stu[i].score[0]);
printf("英語:%f\t",stu[i].score[1]);
printf("計算機:%f\t",stu[i].score[2]);
printf("平均成績:%f\t",stu[i].aver);
printf("總分:%f\t",stu[i].total);
printf("\n\n");
}
return 0;
}
註:(源程序中主要標識符含義說明)
#define STU_NUM 10 /*宏定義學生的數量*/
struct student /*定義一個結構體用來存放學生學號、三門課成績、總分及平均成績*/
{
char stu_id[20]; /*學生學號;*/
float score[3]; /*三門課成績;*/
float total; /*總成績;*/
float aver; /*平均成績;*/
}
實驗結果:
輸入 :(只輸入後面的數字,前面的文字是自己產生的)。
請輸入第1個學生的學號:001
輸入第1個學生的數學成績:1
輸入第1個學生的英語成績:1
輸入第1個學生的計算機成績:1
請輸入第2個學生的學號:002
輸入第2個學生的數學成績:2
輸入第2個學生的英語成績:2
輸入第2個學生的計算機成績:2
請輸入第3個學生的學號:003
輸入第3個學生的數學成績:3
輸入第3個學生的英語成績:3
輸入第3個學生的計算機成績:3
請輸入第4個學生的學號:004
輸入第4個學生的數學成績:4
輸入第4個學生的英語成績:4
輸入第4個學生的計算機成績:4
請輸入第5個學生的學號:005
輸入第5個學生的數學成績:5
輸入第5個學生的英語成績:5
輸入第5個學生的計算機成績:5
請輸入第6個學生的學號:006
輸入第6個學生的數學成績:6
輸入第6個學生的英語成績:6
輸入第6個學生的計算機成績:6
請輸入第7個學生的學號:007
輸入第7個學生的數學成績:7
輸入第7個學生的英語成績:7
輸入第7個學生的計算機成績:7
請輸入第8個學生的學號:008
輸入第8個學生的數學成績:8
輸入第8個學生的英語成績:8
輸入第8個學生的計算機成績:8
請輸入第9個學生的學號:009
輸入第9個學生的數學成績:9
輸入第9個學生的英語成績:9
輸入第9個學生的計算機成績:9
請輸入第10個學生的學號:010
輸入第10個學生的數學成績:10
輸入第10個學生的英語成績:10
輸入第10個學生的計算機成績:10
輸出:
序號: 0 學號:010 數學:10.000000 英語:10.000000 計算機:10.000000
平均成績:10.000000 總分:30.000000

序號: 1 學號:009 數學:9.000000 英語:9.000000 計算機:9.000000
平均成績:9.000000 總分:27.000000

序號: 2 學號:008 數學:8.000000 英語:8.000000 計算機:8.000000
平均成績:8.000000 總分:24.000000

序號: 3 學號:007 數學:7.000000 英語:7.000000 計算機:7.000000
平均成績:7.000000 總分:21.000000

序號: 4 學號:006 數學:6.000000 英語:6.000000 計算機:6.000000
平均成績:6.000000 總分:18.000000

序號: 5 學號:005 數學:5.000000 英語:5.000000 計算機:5.000000
平均成績:5.000000 總分:15.000000

序號: 6 學號:004 數學:4.000000 英語:4.000000 計算機:4.000000
平均成績:4.000000 總分:12.000000

序號: 7 學號:003 數學:3.000000 英語:3.000000 計算機:3.000000
平均成績:3.000000 總分:9.000000

序號: 8 學號:002 數學:2.000000 英語:2.000000 計算機:2.000000
平均成績:2.000000 總分:6.000000

序號: 9 學號:001 數學:1.000000 英語:1.000000 計算機:1.000000
平均成績:1.000000 總分:3.000000
七、撰寫課程設計報告或課程設計總結
課程設計報告要求:
總結報告包括需求分析、總體設計、詳細設計、編碼(詳細寫出編程步驟)、測試的步驟和內容、課程設計總結、參考資料等,不符合以上要求者,則本次設計以不及格記。

C語言常見錯誤
書寫標識符時,忽略了大小寫字母的區別
main()
{
int a=5;
printf("%d",A);
}
編譯程序把a和A認為是兩個不同的變數名,而顯示出錯信息。C認為大寫字母和小寫字母是兩個不同的字元。習慣上,符號常量名用大寫,變數名用小寫表示,以增加可讀性。
2.忽略了變數的類型,進行了不合法的運算。
main()
{
float a,b;
printf("%d",a%b);
}
%是求余運算,得到a/b的整余數。整型變數a和b可以進行求余運算,而實型變數則不允許進行「求余」運算。
3.將字元常量與字元串常量混淆。
char c;
c="a";
在這里就混淆了字元常量與字元串常量,字元常量是由一對單引號括起來的單個字元,字元串常量是一對雙引號括起來的字元序列。C規定以「\」作字元串結束標志,它是由系統自動加上的,所以字元串「a」實際上包含兩個字元:『a'和『\',而把它賦給一個字元變數是不行的。
4.忽略了「=」與「==」的區別。
在許多高級語言中,用「=」符號作為關系運算符「等於」。如在BASIC程序中可以寫
if (a=3) then …
但C語言中,「=」是賦值運算符,「==」是關系運算符。如:
if (a==3) a=b;
前者是進行比較,a是否和3相等,後者表示如果a和3相等,把b值賦給a。由於習慣問題,初學者往往會犯這樣的錯誤。
5.忘記加分號。
分號是C語句中不可缺少的一部分,語句末尾必須有分號。
a=1
b=2
編譯時,編譯程序在「a=1」後面沒發現分號,就把下一行「b=2」也作為上一行語句的一部分,這就會出現語法錯誤。改錯時,有時在被指出有錯的一行中未發現錯誤,就需要看一下上一行是否漏掉了分號。
{ z=x+y;
t=z/100;
printf("%f",t);
}
對於復合語句來說,最後一個語句中最後的分號不能忽略不寫(這是和PASCAL不同的)。
6.多加分號。
對於一個復合語句,如:
{ z=x+y;
t=z/100;
printf("%f",t);
};
復合語句的花括弧後不應再加分號,否則將會畫蛇添足。
又如:
if (a%3==0);
I++;
本是如果3整除a,則I加1。但由於if (a%3==0)後多加了分號,則if語句到此結束,程序將執行I++語句,不論3是否整除a,I都將自動加1。
再如:
for (I=0;I<5;I++);
{scanf("%d",&x);
printf("%d",x);}
本意是先後輸入5個數,每輸入一個數後再將它輸出。由於for()後多加了一個分號,使循環體變為空語句,此時只能輸入一個數並輸出它。
7.輸入變數時忘記加地址運算符「&」。
int a,b;
scanf("%d%d",a,b);
這是不合法的。Scanf函數的作用是:按照a、b在內存的地址將a、b的值存進去。「&a」指a在內存中的地址。
8.輸入數據的方式與要求不符。①scanf("%d%d",&a,&b);
輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:
3,4
輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。
②scanf("%d,%d",&a,&b);
C規定:如果在「格式控制」字元串中除了格式說明以外還有其它字元,則在輸入數據時應輸入與這些字元相同的字元。下面輸入是合法的:
3,4
此時不用逗號而用空格或其它字元是不對的。
3 4 3:4
又如:
scanf("a=%d,b=%d",&a,&b);
輸入應如以下形式:
a=3,b=4
9.輸入字元的格式與要求不一致。
在用「%c」格式輸入字元時,「空格字元」和「轉義字元」都作為有效字元輸入。
scanf("%c%c%c",&c1,&c2,&c3);
如輸入a b c
字元「a」送給c1,字元「 」送給c2,字元「b」送給c3,因為%c只要求讀入一個字元,後面不需要用空格作為兩個字元的間隔。
10.輸入輸出的數據類型與所用格式說明符不一致。
例如,a已定義為整型,b定義為實型
a=3;b=4.5;
printf("%f%d\n",a,b);
編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。
11.輸入數據時,企圖規定精度。
scanf("%7.2f",&a);
這樣做是不合法的,輸入數據時不能規定精度。
12.switch語句中漏寫break語句。
例如:根據考試成績的等級列印出百分制數段。
switch(grade)
{ case 'A':printf("85~100\n");
case 'B':printf("70~84\n");
case 'C':printf("60~69\n");
case 'D':printf("<60\n");
default:printf("error\n");
由於漏寫了break語句,case只起標號的作用,而不起判斷作用。因此,當grade值為A時,printf函數在執行完第一個語句後接著執行第二、三、四、五個printf函數語句。正確寫法應在每個分支後再加上「break;」。例如
case 'A':printf("85~100\n");break;
13.忽視了while和do-while語句在細節上的區別。
(1)main()
{int a=0,I;
scanf("%d",&I);
while(I<=10)
{a=a+I;
I++;
}
printf("%d",a);
}
(2)main()
{int a=0,I;
scanf("%d",&I);
do
{a=a+I;
I++;
}while(I<=10);
printf("%d",a);
}
可以看到,當輸入I的值小於或等於10時,二者得到的結果相同。而當I>10時,二者結果就不同了。因為while循環是先判斷後執行,而do-while循環是先執行後判斷。對於大於10的數while循環一次也不執行循環體,而do-while語句則要執行一次循環體。
14.定義數組時誤用變數。
int n;
scanf("%d",&n);
int a[n];
數組名後用方括弧括起來的是常量表達式,可以包括常量和符號常量。即C不允許對數組的大小作動態定義。
15.在定義數組時,將定義的「元素個數」誤認為是可使的最大下標值。
main()
{static int a[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d",a[10]);
}
C語言規定:定義時用a[10],表示a數組有10個元素。其下標值由0開始,所以數組元素a[10]是不存在的。
16.初始化數組時,未使用靜態存儲
int a[3]={0,1,2};
這樣初始化數組是不對的。C語言規定只有靜態存儲(static)數組和外部存儲(exterm)數組才能初始化。應改為:
static int a[3]={0,1,2};
17.在不應加地址運算符&的位置加了地址運算符。
scanf("%s",&str);
C語言編譯系統對數組名的處理是:數組名代表該數組的起始地址,且scanf函數中的輸入項是字元數組名,不必要再加地址符&。應改為:
scanf("%s",str);
18.同時定義了形參和函數中的局部變數。
int max(x,y)
int x,y,z;
{z=x>y?x:y;
return(z);
}
形參應該在函數體外定義,而局部變數應該在函數體內定義。應改為:
int max(x,y)
int x,y;
{int z;
z=x>y?x:y;
return(z);
}
這是我們今年的課設答案,絕對正確哦!!

㈥ gg修改器源碼要放什麼位置

gg修改器源碼要放安裝包里。
1、以血量修改為例子,搜索1065353216。100。939524097。
2、用dword模式搜索。
3、再搜索1065353216,找到第九個數改成-1,其他的改成1140457472就是0血不死。

㈦ 在我國源代碼版權登記注冊需注意事項是什麼

一、在我國源代碼版權登記注冊需注意事項是什麼? 計算機軟體源代表是申請 軟體著作權 登記需要提供的材料之一,源代碼是不能單獨登記 著作權 的,需要和其他材料共同申請登記。 1、第九條申請軟體著作權登記的,應當向中國版權保護中心提交以下材料: (一)按要求填寫的軟體著作權登記申請表; (二)軟體的鑒別材料; (三)相關的證明文件。 2、第十條軟體的鑒別材料包括程序和文檔的鑒別材料。 程序和文檔的鑒別材料應當由源程序和任何一種文檔前、後各連續30頁組成。整個程序和文檔不到60頁的,應當提交整個源程序和文檔。除特定情況外,程序每頁不少於50行,文檔每頁不少於30行。 3、第十一條申請軟體著作權登記的,應當提交以下主要證明文件: (一)自然人、法人或者其他組織的 身份證 明; (二)有著作權歸屬書面合同或者項目任務書的,應當提交合同或者項目任務書; (三)經原軟體著作權人許可,在原有軟體上開發的軟體,應當提交原著作權人的許可證明; (四)權利 繼承人 、受讓人或者承受人,提交權利 繼承 、受讓或者承受的證明。 二、版權登記的簡介 1、版權又稱為著作權,根據自願原則,對下列作品進行 著作權登記 :軟體著作權;文字作品;口述作品;音樂、戲劇、曲藝、舞蹈、雜技藝術作品;美術、建築作品;攝影作品;電影作品和以類似攝制電影的方法創作的作品;工程設計圖、產品設計圖、地圖、示意圖等圖形作品和模型作品;法律、行政 法規 規定的其他作品。 此外還受理其他與著作權有關事項的登記;各類作品(計算機軟體除外)授權事項登記;錄音、錄像製品登記;其他與著作權有關的受國家版權局的指定,中心進行的登記等。 2、出版境外音像製品合同登記:受國家版權局的委託,音像出版單位出版境外音像製品,包括以錄音帶、錄像帶、激光唱盤、激光視盤及其他音像製品形式的出版合同,報中心認證登記。 3、著作權 質押 合同登記。 4、提供與各項登記有關的服務;提供與各項登記有關的咨詢服務;代為起草與各項登記有關的文書,聯系與登記有關的事務等。著作權登記收費項目已經由國家發展和改革委員會批准,中心按照《國家發展改革委關於著作權自願登記收費有關問題的通知》規定收費。 在我國源代碼版權登記注冊是不能單獨申請的,必須要跟其他材料一起共同申請才行。源代碼只是申請軟體注冊登記的重要資料之一。針對版權登記的簡介相關法律條例也是做出了明確的規定,主要包括版權合同登記,版權提供的相關服務登記。這樣有備案的話避免後期不必要的麻煩。

㈧ 計算機病毒介紹及防治

計算機病毒厲害的有哪些呢?要怎麼樣去防治?下面由我給你做出詳細的計算機病毒介紹及防範 方法 介紹!希望對你有幫助!

目前流行的計算機病毒概括成如下四類:

計算機病毒1 . 操作系統 病毒

這種病毒的特點是:當系統引導時就裝入內存,在計算機運行過程中,能夠經常捕獲到CPU的控制權,在得到CPU的控制權時進行病毒傳播,並在特定條件下發作。該類病毒的上述活動是悄悄完成的,很難被發覺,因而有很大的危險性。

計算機病毒2 .源碼型病毒

源碼型病毒專門攻擊高級語言如FORTRAN、C、PASCAL等源程序和數據文件的源碼。它們在編譯之前插入到源程序。

計算機病毒3 .外殼型病毒

這類病毒攻擊的主要目標是系統的.COM、.EXE等可執行文件。染上這種病毒的可執行文件一旦運行,首先執行這段病毒程序,達到不斷復制的目的。由於它的不斷繁殖,使計算機工作效率大大降低,最終造成 死機 。

計算機病毒4. 定時炸彈型病毒

許多微機上配有供系統時鍾用的擴充板,擴充板上有可充電電池和CMOS存儲器,定時炸彈型病毒可避開DOS的中斷調用,通過低層硬體訪問對CMOS存儲讀寫。因而這類程序利用這一地方作為傳染、觸發、破壞的標志,甚至乾脆將病毒程序的一部分寄生到這個地方,因這個地方有鋰電池為它提供保護,不會因關機或斷電而丟失,所以這類病毒十分危險。

近兩年,計算機病毒已經發展到多形性病毒、欺騙性病毒、輕微破壞型病毒以及病毒生成工具等。這些病毒更隱蔽、破壞性更強。例如,多形性病毒每次感染的形式都不一樣,使查找更加困難,清除更不容易;被欺騙性病毒感染的文件,在列目錄顯示或讀文件時,文件的大小和內容都正常,用戶無法知道已被感染;被輕微破壞型病毒感染的文件,每次備份只破壞很少數據,很難察覺。一旦發現,被破壞的數據已無

計算機病毒防治原理:

反病毒軟體的任務是實時監控和掃描磁碟。部分反病毒軟體通過在系統添加驅動程序的方式,進駐系統,並且隨操作系統啟動。大部分的殺毒軟體還具有防火牆功能。

反病毒軟體的實時監控方式因軟體而異。有的反病毒軟體,是通過在內存里劃分一部分空間,將電腦里流過內存的數據與反病毒軟體自身所帶的病毒庫(包含病毒定義)的特徵碼相比較,以判斷是否為病毒。另一些反病毒軟體則在所劃分到的內存空間裡面,虛擬執行系統或用戶提交的程序,根據其行為或結果作出判斷。

而掃描磁碟的方式,則和上面提到的實時監控的第一種工作方式一樣,只是在這里,反病毒軟體將會將磁碟上所有的文件(或者用戶自定義的掃描范圍內的文件)做一次檢查。

推薦殺軟:2009年世界頂級殺毒軟體排名

toptennews評出了2009年度世界頂級殺毒軟體排名,國外的排名僅供參考,它們不一定能完全適應中國的水土。我們來簡單看一下排名情況:

第一:BitDefender ,來自羅馬尼亞,連續三年第一。

第二:赫赫有名的Kaspersky(卡巴斯基)。

第三:Webroot Antivirus ,今年第一次上榜,反間諜能力比較強。

第四:G DATA AntiVirus,今年第一次上榜,特點為雙引擎殺毒。

第五:ESET NOD32,從去年的第三滑到了第五。

第六:ParetoLogic Anti-Virus PLUS,微軟的產品,第一次上榜。

第七:AVG Anti-Virus ,來自捷克,2005 年獲 Virus bulletin 的 VB100% 獎。

第八:Vipre Antivirus + Antispyware

第九:F-Secure Anti-Virus來自芬蘭,集合四套殺毒引擎,包括Kaspersky 的殺毒內核。

第十:Trend Micro AntiVirus,趨勢科技的產品。

㈨ 按鍵精靈 語法錯誤 第1行,第9個字元 是怎麼回事啊

我說下啊,錯就錯在你一行一行復制,因為那些源碼經過翻譯,直接復制是不正確的,應該點擊下載源碼,然後把源碼導入按鍵精靈才正確,
解釋下,第一句應該是:
PutAttachment ".\plugin","*.dll"
下面的更離譜了,全有個 「令」字,為什麼會有個令字呢?剛說了別人經過他的插件翻譯過的,實際上語句是沒有中文「令」的。 你點擊下網址上的:源碼視圖 就一清二楚了

㈩ [Spring boot源碼解析] 2 啟動流程分析

在了解 Spring Boot 的啟動流程的時候,我們先看一下一個Spring Boot 應用是如何啟動的,如下是一個簡單的 SpringBoot 程序,非常的簡潔,他是如何做到的呢,我們接下來就將一步步分解。

我們追蹤 SpringApplication.run() 方法,其實最終它主要的邏輯是新建一個 SpringApplication ,然後調用他的 run 方法,如下:

我們先來看一下創建 SpringApplication 的方法:

在將Main class 設置 primarySources 後,調用了 WebApplicationType.deceFromClasspath() 方法,該方法是為了檢查當前的應用類型,並設置給 webApplicationType 。 我們進入 deceFromClasspath 方法 :

這里主要是通過類載入器判斷是否存在 REACTIVE 相關的類信息,假如有就代表是一個 REACTIVE 的應用,假如不是就檢查是否存在 Servelt 和 ,假如都沒有,就代表應用為非 WEB 類應用,返回 NONE ,默認返回 SERVLET 類型,我們這期以我們目前最常使用的 SERVLET 類型進行講解,所以我們在應用中引入了 spring-boot-starter-web 作為依賴:

他會包含 Spring-mvc 的依賴,所以就包含了內嵌 tomcat 中的 Servlet 和 Spring-web 中的 ,因此返回了 SERVLET 類型。

回到剛才創建 SpringApplication 的構建方法中,我們設置完成應用類型後,就尋找所有的 Initializer 實現類,並設置到 SpringApplication 的 Initializers 中,這里先說一下 getSpringFactoriesInstances 方法,我們知道在我們使用 SpringBoot 程序中,會經常在 META-INF/spring.factories 目錄下看到一些 EnableAutoConfiguration ,來出發 config 類注入到容器中,我們知道一般一個 config 類要想被 SpringBoot 掃描到需要使用 @CompnentScan 來掃描具體的路徑,對於 jar 包來說這無疑是非常不方便的,所以 SpringBoot 提供了另外一種方式來實現,就是使用 spring.factories ,比如下面這個,我們從 Springboot-test 中找到的例子,這里先定義了一個ExampleAutoConfiguration,並加上了 Configuration 註解:

然後在 spring.factories 中定義如下:

那這種方式是怎麼實現的你,這就要回到我們剛才的方法 getSpringFactoriesInstances :

我們先來看一下傳入參數,這里需要注意的是 args,這個是初始化對應 type 的時候傳入的構造參數,我們先看一下 SpringFactoriesLoader#loadFactoryNames 方法:

首先是會先檢查緩存,假如緩存中存在就直接返回,假如沒有就調用 classLoader#getResources 方法,傳入 META-INF/spring.factories ,即獲取所有 jar 包下的對應文件,並封裝成 UrlResource ,然後使用 PropertiesLoaderUtils 將這些信息讀取成一個對一對的 properties,我們觀察一下 spring.factories 都是按 properties 格式排版的,假如有多個就用逗號隔開,所以這里還需要將逗號的多個類分隔開來,並加到 result 中,由於 result 是一個 LinkedMultiValueMap 類型,支持多個值插入,最後放回緩存中。最終完成載入 META-INF/spring.factories 中的配置,如下:

我們可以看一下我們找到的 initializer 有多少個:

在獲取到所有的 Initializer 後接下來是調用 方法進行初始化。

這里的 names 就是我們上面通過類載入器載入到的類名,到這里會先通過反射生成 class 對象,然後判斷該類是否繼承與 ApplicationContextInitializer ,最後通過發射的方式獲取這個類的構造方法,並調用該構造方法,傳入已經定義好的構造參數,對於 ApplicationContextInitializer 是無參的構造方法,然後初始化實例並返回,回到原來的方法,這里會先對所有的 ApplicationContextInitializer 進行排序,調用 #sort(instances) 方法,這里就是根據 @Order 中的順序進行排序。

接下來是設置 ApplicationListener ,我們跟進去就會發現這里和上面獲取 ApplicationContextInitializer 的方法如出一轍,最終會載入到如圖的 15 個 listener (這里除了 外,其他都是 SpringBoot 內部的 Listener):

在完成 SpringApplication 對象的初始化後,我們進入了他的 run 方法,這個方法幾乎涵蓋了 SpringBoot 生命周期的所有內容,主要分為九個步驟,每一個步驟這里都使用註解進行標識:

主要步驟如下:
第一步:獲取 SpringApplicationRunListener, 然後調用他的 staring 方法啟動監聽器。
第二步:根據 SpringApplicationRunListeners以及參數來准備環境。
第三步:創建 Spring 容器。
第四步:Spring 容器的前置處理。
第五步:刷新 Spring 容器。
第六步: Spring 容器的後置處理器。
第七步:通知所有 listener 結束啟動。
第八步:調用所有 runner 的 run 方法。
第九步:通知所有 listener running 事件。
我們接下來一一講解這些內容。

我們首先看一下第一步,獲取 SpringApplicationRunListener :

這里和上面獲取 initializer 和 listener 的方式基本一致,都是通過 getSpringFactoriesInstances , 最終只找到一個類就是: org.springframework.boot.context.event.EventPublishingRunListener ,然後調用其構造方法並傳入產生 args , 和 SpringApplication 本身:

我們先看一下構造函數,首先將我們獲取到的 ApplicationListener 集合添加到initialMulticaster 中, 最後都是通過操作 來進行廣播,我,他繼承於 ,我們先看一下他的 addApplicationListener 方法:

我們可以看出,最後是放到了 applicationListenters 這個容器中。他是 defaultRetriever 的成員屬性, defaultRetriever 則是 的私有類,我們簡單看一下這個類:

我們只需要看一下這里的 getApplicationListeners 方法,它主要是到 beanFactory 中檢查是否存在多的 ApplicationListener 和舊的 applicationListeners 組合並返回,接著執行 listener 的 start 方法,最後也是調用了 的 multicastEvent 查找支持對應的 ApplicationEvent 類型的通知的 ApplicationListener 的 onApplicationEvent 方法 ,這里除了會:

篩選的方法如下,都是調用了對應類型的 supportsEventType 方法 :

如圖,我們可以看到對 org.springframework.boot.context.event.ApplicationStartingEvent 感興趣的有5個 Listener

環境准備的具體方法如下:

首先是調用 getOrCreateEnvironment 方法來創建 environment ,我們跟進去可以發現這里是根據我們上面設置的環境的類型來進行選擇的,當前環境會創建 StandardServletEnvironment

我們先來看一下 StandardServletEnvironment 的類繼承關系圖,我們可以看出他是繼承了 AbstractEnvironment :

他會調用子類的 customizePropertySources 方法實現,首先是 StandardServletEnvironment 的實現如下,他會添加 servletConfigInitParams , servletContextInitParams , jndiProperties 三種 properties,當前調試環境沒有配置 jndi properties,所以這里不會添加。接著調用父類的 customizePropertySources 方法,即調用到了 StandardEnvironment 。

我們看一下 StandardEnvironment#customizePropertySources 方法,與上面的三個 properties 創建不同,這兩個是會進行賦值的,包括系統環境變數放入 systemEnvironment 中,jvm 先關參數放到 systemProperties 中:

這里會添加 systemEnvironment 和 systemProperties 這兩個 properties,最終拿到的 properties 數量如下 4個:

在創建完成 Environment 後,接下來就到了調用 configureEnvironment 方法:

我們先看一下 configurePropertySources 方法,這里主要分兩部分,首先是查詢當前是否存在 defaultProperties ,假如不為空就會添加到 environment 的 propertySources 中,接著是處理命令行參數,將命令行參數作為一個 CompositePropertySource 或則 添加到 environment 的 propertySources 裡面,

接著調用 ConfigurationPropertySources#attach 方法,他會先去 environment 中查找 configurationProperties , 假如尋找到了,先檢查 configurationProperties 和當前 environment 是否匹配,假如不相等,就先去除,最後添加 configurationProperties 並將其 sources 屬性設置進去。

回到我們的 prepareEnvironment 邏輯,下一步是通知觀察者,發送 事件,調用的是 SpringApplicationRunListeners#environmentPrepared 方法,最終回到了 #multicastEvent 方法,我們通過 debug 找到最後對這個時間感興趣的 Listener 如下:

其主要邏輯如下:

這個方法最後載入了 PropertySourceLoader , 這里主要是兩種,一個是用於 Properties 的,一個是用於 YAML 的如下:

其中 apply 方法主要是載入 defaultProperties ,假如已經存在,就進行替換,而替換的目標 PropertySource 就是 load 這里最後的一個 consumer 函數載入出來的,這里列一下主要做的事情:
1、載入系統中設置的所有的 Profile 。
2、遍歷所有的 Profile ,假如是默認的 Profile , 就將這個 Profile 加到 environment 中。
3、調用load 方法,載入配置,我們深入看一下這個方法:

他會先調用 getSearchLocations 方法,載入所有的需要載入的路徑,最終有如下路徑:

其核心方法是遍歷所有的 propertySourceLoader ,也就是上面載入到兩種 propertySourceLoader ,最紅 loadForFileExtension 方法,載入配置文件,這里就不展開分析了,說一下主要的作用,因為每個 propertySourceLoader 都有自己可以載入的擴展名,默認擴展名有如下四個 properties, xml, yml, yaml,所以最終拿到文件名字,然後通過 - 拼接所有的真實的名字,然後加上路徑一起載入。

接下來,我們分析 BackgroundPreinitializer ,這個方法在接收 ApplicationPrepareEnvironment 事件的時候真正調用了這份方法:

1、 ConversionServiceInitializer 主要負責將包括 日期,貨幣等一些默認的轉換器注冊到 formatterRegistry 中。
2、 ValidationInitializer 創建 validation 的匹配器。
3、 MessageConverterInitializer 主要是添加了一些 http 的 Message Converter。
4、 JacksonInitializer 主要用於生成 xml 轉換器的。
接著回到我們將的主體方法, prepareEnvironment 在調用完成 listeners.environmentPrepared(environment) 方法後,調用 bindToSpringApplication(environment) 方法,將 environment 綁定到 SpirngApplication 中。
接著將 enviroment 轉化為 StandardEnvironment 對象。
最後將 configurationProperties 加入到 enviroment 中, configurationProperties 其實是將 environment 中其他的 PropertySource 重新包裝了一遍,並放到 environment 中,這里主要的作用是方便 進行解析。

它主要是檢查是否存在 spring.beaninfo.ignore 配置,這個配置的主要作用是設置 javaBean 的內省模式,所謂內省就是應用程序在 Runtime 的時候能檢查對象類型的能力,通常也可以稱作運行時類型檢查,區別於反射主要用於修改類屬性,內省主要用戶獲取類屬性。那麼我們什麼時候會使用到內省呢,java主要是通過內省工具 Introspector 來完成內省的工作,內省的結果通過一個 Beaninfo 對象返回,主要包括類的一些相關信息,而在 Spring中,主要是 BeanUtils#Properties 會使用到,Spring 對內省機制還進行了改進,有三種內省模式,如下圖中紅色框框的內容,默認情況下是使用 USE_ALL_BEANINFO。假如設置為true,就是改成第三中 IGNORE_ALL_BEANINFO

首先是檢查 Application的類型,然後獲取對應的 ApplicationContext 類,我們這里是獲取到了 org.springframework.boot.web.servlet.context. 接著調用 BeanUtils.instantiateClass(contextClass); 方法進行對象的初始化。

最終其實是調用了 的默認構造方法。我們看一下這個方法做了什麼事情。這里只是簡單的設置了一個 reader 和一個 scanner,作用於 bean 的掃描工作。

我們再來看一下這個類的繼承關系

這里獲取 ExceptionReporter 的方式主要還是和之前 Listener 的方式一致,通過 getSpringFactoriesInstances 來獲取所有的 SpringBootExceptionReporter 。

其主要方法執行如下:

熱點內容
捷達方向機安全登錄密碼是多少 發布:2025-07-19 00:57:37 瀏覽:688
夜魔迅雷下載ftp 發布:2025-07-19 00:39:29 瀏覽:94
增值稅票安全接入伺服器地址 發布:2025-07-19 00:20:45 瀏覽:481
solidworkspcb伺服器地址 發布:2025-07-18 22:50:35 瀏覽:817
怎麼在堆疊交換機里配置vlan 發布:2025-07-18 22:42:35 瀏覽:625
java調用別人的介面 發布:2025-07-18 22:37:35 瀏覽:437
伺服器四個節點如何聯網 發布:2025-07-18 22:36:02 瀏覽:273
華強北什麼地方休安卓手機 發布:2025-07-18 22:24:56 瀏覽:737
資料庫的根本目標 發布:2025-07-18 21:37:50 瀏覽:941
壓縮機的流速 發布:2025-07-18 21:37:40 瀏覽:409