P. 1
Lop java va nap lop

Lop java va nap lop

|Views: 4|Likes:
Được xuất bản bởiHellmaster Amry
Tai lieu hoc java
Tai lieu hoc java

More info:

Published by: Hellmaster Amry on Jun 01, 2013
Bản quyền:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

05/05/2014

pdf

text

original

Ðông luc hoc lâp trình Java, Phân 1: Các lóp Java

và viêc nap các lóp
Quan sát các lóp và nhüng gì xáy ra khi chúng duqc mçt JVM nqp
Muc dô: Trung bình
Dennis Sosnoski, Nhà tu vân, Sosnoski Software Solutions, Inc.
04 12 2009
Hãy xem xét nhung gì xay ra o hâu truong vê viêc thuc hiên ung dung Java cua ban trong loat bài viêt
moi vê các khía canh dông cua lâp trình Java. Chuyên gia Java doanh nghiêp Dennis Sosnoski dua ra tin
sô deo vê dinh dang lop nhi phân Java và nhung gì xay ra voi các lop bên trong JVM. Trong bài này, ông
còn trình bày các vân dê nap lop nám trong pham vi tu sô luong các lop cân thiêt dê chay môt ung dung
Java don gian dên các xung dôt trình nap lop, mà chúng có thê gây ra các vân dê trong J2EE và các kiên
trúc phuc tap tuong tu.
Bài viêt này mo dâu môt loat bài viêt moi trình bày môt ho các chu dê mà tôi goi là dong luc hoc lap trình Java. Các
chu dê gôm tu câu trúc co so cua dinh dang têp lop nhi phân Java, thông qua truy câp siêu du liêu trong thoi gian chay
báng cách su dung su phan chiêu, tât ca các cách dê sua dôi và xây dung các lop moi trong thoi gian chay. Các chu dê
chung chay xuyên suôt tât ca tài liêu này là ý tuong trong dó viêc lâp trình nên tang Java là náng dông nhiêu hon làm
viêc voi các ngôn ngu biên dich tháng voi mã gôc. Nêu ban hiêu nhung khía canh náng dông này, ban có thê làm nhiêu
thu voi lâp trình Java mà không thê khop voi bât kì ngôn ngu lâp trình chu dao nào khác.
Trong bài viêt này, tôi trình bày môt sô các khái niêm co ban làm nên tang cho các tính náng dông này cua nên tang
Java. Các khái niêm này xoay quanh dinh dang nhi phân duoc su dung dê biêu diên các lop Java, gôm ca nhung gì së
xay ra khi nhung lop này duoc nap vào trong JVM. Tài liêu này không chi cung câp môt nên móng cho phân còn lai
cua các bài viêt trong loat này, mà nó còn giai thích môt sô các môi quan tâm rât thiêt thuc cho các nhà phát triên dang
làm viêc trên nên tang Java.
Môt lóp duói dang mã nh[ phân
Các nhà phát triên dang làm viêc trong ngôn ngu Java thuong không phai bân tâm dên các chi tiêt vê nhung gì xay ra
voi mã nguôn cua ho khi nó duoc chay qua trình biên dich. Trong loat bài này, tôi sáp trình bày rât nhiêu các chi tiêt o
hâu truong liên quan dên viêc së xay ra tu mã nguôn dê thuc hiên chuong trình, tuy nhiên, tôi së bát dâu xem xét tai
các lop nhi phân do môt trình biên dich tao ra.
Dinh dang lop nhi phân trên thuc tê duoc dác ta JVM xác dinh. Bình thuong, tu mã nguôn cua ngôn ngu Java, môt
trình biên dich tao ra các cách biêu diên các lop này và chúng thuong duoc luu tru trong các têp có phân mo
rông .class. Tuy vây, ca hai tính náng này không cân thiêt. Các ngôn ngu lâp trình khác dã duoc phát triên có su
dung dinh dang lop nhi phân Java và voi môt sô muc dích, các cách biêu diên lop moi duoc xây dung và ngay lâp tuc
duoc nap trong lúc thuc hiên JVM. Dôi voi JVM , phân quan trong không phai là mã nguôn hoác cách nó duoc luu tru,
mà là chính dinh dang cua nó.
Vì vây, trên thuc tê lop này dinh dang trông nhu thê nào? Liêt kê 1 dua ra các mã nguôn cho môt lop (rât) ngán, cùng
voi môt phân hiên thi hê dêm muoi sáu cua kêt qua têp lop cua trình biên dich:

Liçt kê 1. Mã nguôn và (mçt phân) mã nh| phân cho tçp Hello.java
pub11c c1ass he11o
{
pub11c sfaf1c vo1d ma1n{5f¡1ng|] a¡gs} {
5ysfem.ouf.p¡1nf1n{"he11o, Wo¡1d!"}¦
}
}

0000: cafe babe 0000 002e 001a 0a00 0600 0c09 ................
0010: 000d 000e 0ß00 0f0a 0010 0011 0700 1207 ................
0020: 0013 0100 063c 696e 6974 3e01 0003 2ß29 .....<1n1f>...{}
0030: 5601 0004 436f 6465 0100 046d 6169 6e01 v...Code...ma1n.
Page 1 of 7 Dông luc hoc lâp trình Java, Phân 1: Các lop Java và viêc nap các lop

Bên trong mã nh[ phân
Diêu dâu tiên trong viêc biêu diên lop nhi phân duoc thê hiên trong Liêt kê 1 là chu kí "quán cafe babe" dê xác nhân
dinh dang lop nhi phân Java (và ngâu nhiên dùng nhu là môt -- nhung phân lon không duoc thua nhân -- chung cu bên
vung cho nhung nguoi pha cà phê (baristas) làm viêc chám chi, nhung nguoi giu tinh thân cho các nhà phát triên dang
xây dung nên tang Java). Chu kí này là môt cách dê dàng dê xác minh ráng môt khôi du liêu thuc su dua ra yêu câu là
môt cá thê cua dinh dang lop Java. Môi lop nhi phân Java, thâm chí môt lop không có trên hê thông têp tin dó, cân bát
dâu báng bôn byte này.
Phân còn lai cua du liêu ít thú vi. Sau chu kí là môt cáp các sô phiên
ban dinh dang lop (trong truong hop này, phiên ban phu 0 và phiên
ban chính 46 -- hê dêm muoi sáu 0x2e -- nhu duoc tao ra boi các javac
1.4.1), sau dó môt sô dêm các lôi vào trong nhóm háng sô. Sô dêm lôi
vào (trong truong hop 26 này hoác 0x001a) tiêp theo là du liêu cua
nhóm háng sô thuc su. Dây là noi luu tru tât ca các háng sô duoc su
dung boi các dinh nghia lop. Nó gôm lop và các tên phuong thuc, các
chu kí và các chuôi (mà ban có thê nhân ra trong phân giai thích báng
ván ban o bên phai cua kêt qua theo hê dêm muoi sáu), cùng voi các
giá tri nhi phân khác nhau.
Các muc trong nhóm háng sô có chiêu dài thay dôi, voi byte dâu tiên
cua môi muc xác dinh kiêu muc và cách giai mã nó. Ta së không di
vào chi tiêt cua tât ca thu có o dây -- có rât nhiêu tài liêu tham khao có
sán nêu ban quan tâm, bát dâu voi dác ta JVM thuc su. Diêm mâu chôt
là nhóm háng sô có tât ca các tham chiêu dên các lop khác và các
phuong thuc duoc lop này su dung, cùng voi nhung dinh nghia thuc
su cho lop này và các phuong thuc cua nó. Nhóm háng sô có thê dê
dàng chiêm môt nua hoác phân lon hon cua kích thuoc lop nhi phân,
mác dù ty lê trung bình có lë là thâp hon.
Tiêp theo nhóm háng sô là môt vài muc tham chiêu các lôi vào nhóm
háng sô cho chính lop dó, siêu lop và các giao diên cua nó. Các muc
này duoc kê tiêp boi các thông tin vê các truong và các phuong thuc, chính chúng duoc biêu diên nhu là các câu trúc
phuc tap. Các mã thuc hiên cho các phuong thuc duoc trình bày duoi dang các thuoc tính mã duoc chua trong các dinh
nghia phuong thuc. Mã này có trong dang huong dân cho JVM, thuong duoc goi là mã byte (bytecode), dây là môt
trong nhung chu dê cho phân tiêp theo.
Các thuoc tính duoc su dung cho môt sô các muc dích dã xác dinh
trong dinh dang lop Java, bao gôm ca bytecode dã nói trên, giá tri
háng sô cho các truong, xu lý ngoai lê và thông tin gõ rôi. Dâu sao các
muc dích này không phai chi có kha náng su dung cho các thuôc tính.
Tu dâu, dác ta JVM dã yêu câu các JVM bo qua các thuôc tính cua các
kiêu không rõ. Yêu câu này dua ra tính linh hoat dê cho viêc mo rông
su dung các thuôc tính dê phuc vu cho các muc dích khác trong tuong
lai, nhu là viêc cung câp siêu-thông tin duoc các khung công tác cân
dê làm viêc voi các lop cua nguoi su dung -- môt cách tiêp cân mà các
ngôn ngu C# có nguôn gôc Java dã su dung rông rãi. Thât không may,
vân chua có các kêt nôi nào duoc cung câp dê tiên hành su dung tính linh hoat này o muc nguoi dùng.



0040: 0016 2ß5b 4c6a 6176 612f 6c61 6e67 2f53 ..{|L¸ava/1ang/5
0050: 7472 696e 673b 2956 0c00 0700 0ß07 0014 f¡1ng¦}v........
0060: 0c00 1500 1601 000d 4ß65 6c6c 6f2c 2057 ........he11o, W
0070: 6f72 6c64 2107 0017 0c00 1ß00 1901 0005 o¡1d!...........
00ß0: 4ß65 6c6c 6f01 0010 6a61 7661 2f6c 616e he11o...¸ava/1an
0090: 672f 4f62 6a65 6374 0100 106a 6176 612f g/Ob¸ecf...¸ava/
00a0: 6c61 6e67 2f53 7973 7465 6d01 0003 6f75 1ang/5ysfem...ou
...
Dùng bo lõ phân còn lçi cua loçt bài này

Phân 2, "Gioi thiêu su phan chiêu" (June
2003)

Phân 3, "Ung dung su phan
chiêu" (07.2003)

Phân 4, "Chuyên dôi lop báng
Javassist" (09.2003)

Phân 5, "Viêc chuyên các lop dang hoat
dông" (02.2004)

Phân 6, "Các thay dôi huong-khía canh voi
Javassist" (03.2004)

Phân 7, "Kÿ thuât bytecode voi
BCEL" (04.2004)

Phân 8, "Thay thê su phan chiêu báng viêc
tao mã" (06.2004)
Hoi chuyên gia: Dennis Sosnoski vê các
vân dê JVM và bytecode
Dôi voi các ý kiên hay các câu hoi vê tài
liêu duoc trình bày trong loat bài này, cung
nhu bât cu diêu gì khác có liên quan dên
Java bytecode, dinh dang lop nhi phân Java
hoác các vân dê JVM chung, hãy truy câp
vào diên dàn thao luân JVM và Bytecode,
do Dennis Sosnoski kiêm soát.
Page 2 of 7 Dông luc hoc lâp trình Java, Phân 1: Các lop Java và viêc nap các lop
Bytecode và các ngån xêp
Bytecode chiêm phân thuc thi cua têp lop trên thuc tê là mã máy cho môt loai máy tính dác biêt -- JVM. Máy này
duoc goi là môt máy ao vì nó duoc thiêt kê dê thuc hiên trong phân mêm hon là phân cung. Môi JVM duoc su dung
dê chay các ung dung nên tang Java duoc xây dung xung quanh môt viêc triên khai thuc hiên cua máy này.
Máy ao này thuc su khá don gian. Nó su dung môt kiên trúc ngán xêp, có nghia là các toán hang lênh duoc nap vào
môt ngán xêp bên trong truoc khi chúng duoc su dung. Tâp lênh gôm tât ca các phép toán sô hoc và logic bình thuong,
cùng voi các nhánh có diêu kiên và không diêu kiên, nap/luu tru, goi/tra vê, thao tác ngán xêp và môt sô các kiêu lênh
dác biêt. Môt sô lênh gôm các giá tri toán hang cu thê duoc mã hóa truc tiêp vào trong các lênh. Nhung cái khác truc
tiêp tham chiêu các giá tri tu nhóm háng sô.
Mác dù máy ao don gian, nhung viêc thuc hiên không nhât thiêt phai nhu vây. Các JVM ban dâu (thê hê dâu tiên) vê
co ban dã là các trình dich cho bytecode cua máy ao. Trên thuc tê chúng tuong dôi don gian, nhung bi mác phai vân dê
vê hiêu náng nghiêm trong -- ; viêc thông dich mã luôn luôn së mât nhiêu thoi gian hon so voi thuc hiên mã gôc. Dê
giam các vân dê hiêu náng này, các JVM thê hê thu hai duoc bô sung viêc dich ngay (JIT). Kÿ thuât JIT biên dich
bytecode Java thành mã gôc truoc khi thuc hiên nó cho lân dâu tiên, cho phép hiêu náng tôt hon voi nhiêu lân thuc
hiên láp lai. Các JVM thê hê hiên nay thâm chí còn di xa hon nua, báng cách su dung các kÿ thuât thích nghi dê theo
dõi viêc thuc hiên chuong trình và chon lua tôi uu hóa các mã su dung nhiêu.



Nap các lóp
Các ngôn ngu nhu C và C++ biên dich thành mã gôc thuong dòi hoi môt buoc liên kêt sau khi mã nguôn duoc biên
dich. Quá trình liên kêt này kêt hop mã tu các têp mã nguôn dã biên dich tách biêt nhau, cùng voi mã thu viên dùng
chung, dê tao thành môt chuong trình thuc hiên. Ngôn ngu Java có khác. Voi ngôn ngu Java, các lop duoc trình biên
dich tao ra nói chung vân giu nguyên nhu chúng có cho dên khi chúng dang nap vào môt JVM. Ngay ca viêc xây dung
môt têp JAR tu các têp lop không thay dôi diêu này -- JAR chi là môt thùng chua cho các têp lop dó.
Thay vì là môt buoc riêng rë, viêc liên kêt các lop là môt phân cua môt công viêc duoc JVM thuc hiên khi nó nap
chúng vào trong bô nho. Diêu này bô sung thêm chi phí hoat dông khi các lop duoc nap lúc dâu, nhung cung tao ra
môt muc linh hoat cao hon cho các ung dung Java. Ví du, các ung dung có thê duoc viêt dê su dung các giao diên voi
các viêc thuc hiên thuc su mà chúng dã dê lai không xác dinh cho dên khi dang chay. Cách tiêp cân liên kêt cuoi này
dê láp ráp môt ung dung duoc su dung rông rãi trong nên tang Java, voi các servlet dang là môt ví du phô biên.
Các quy tác dê nap các lop duoc giai thích môt cách chi tiêt trong dác ta JVM. Nguyên tác co ban là các lop chi duoc
nap khi cân thiêt (hoác ít nhât xuât hiên dê duoc nap theo cách này -- JVM có môt sô tính linh hoat trong viêc nap thuc
tê, nhung phai duy trì trình tu khoi tao lop cô dinh). Môi lop dã nap có thê có các lop khác mà nó phu thuôc vào, do
dó, quá trình nap là quá trình dê quy. Các lop trong Liêt kê 2 cho thây viêc nap dê quy này hoat dông nhu thê nào. Lop
Demo gôm môt phuong thuc main (chính) don gian dê tao ra môt cá thê Greeter Nguoi dón khách) và goi phuong
thuc greet. Hàm tao Greeter tao ra môt cá thê Message (Thông báo), nó sau dó su dung trong cuôc goi phuong
thuc greet.

Liçt kê 2. Mã nguôn vói chúng thµc viçc nçp lóp
pub11c c1ass Demo
{
pub11c sfaf1c vo1d ma1n{5f¡1ng|] a¡gs} {
5ysfem.ouf.p¡1nf1n{"""beg1nn1ng execuf1on"""}¦
G¡eefe¡ g¡eefe¡ = neW G¡eefe¡{}¦
5ysfem.ouf.p¡1nf1n{"""c¡eafed G¡eefe¡"""}¦
g¡eefe¡.g¡eef{}¦
}
}

pub11c c1ass G¡eefe¡
{
p¡1vafe sfaf1c Message s¸message = neW Message{"he11o, Wo¡1d!"}¦

pub11c vo1d g¡eef{} {
s¸message.p¡1nf{5ysfem.ouf}¦
Page 3 of 7 Dông luc hoc lâp trình Java, Phân 1: Các lop Java và viêc nap các lop

Thiêt lâp tham sô -verbose:class trên dòng lênh java in ra dâu vêt cua quá trình nap lop. Liêt kê 3 cho thây môt
phân kêt qua tu lúc chay chuong trình cua Liêt kê 2 voi tham sô này:

Liçt kê 3. Mçt phân kêt qua cua -verbose:class

Dây chi là môt phân danh sách cua các phân quan trong nhât -- dâu vêt dây du gôm 294 dòng, mà voi danh sách này
tôi dã xóa hâu hêt. Tâp dâu tiên cua viêc nap lop (trong truong hop này là 279) tât ca duoc kích hoat báng nô luc dê
nap lop Demo. Dây là các lop côt lõi duoc tât ca các chuong trình Java su dung, không kê nho bao nhiêu. Ngay ca viêc
loai bo tât ca các mã khoi phuong thuc Demo main không anh huong dên trình tu nap ban dâu này. Tuy vây, sô luong
và tên cua các lop duoc bao hàm së khác giua môt phiên ban cua thu viên lop này voi môt phiên ban cua thu viên lop
khác.
Phân liêt kê sau khi lop Demo duoc nap së thú vi hon. Trình tu o dây cho thây lop Greeter duoc nap së thú vi hon.
Trình tu o dây cho thây lop Greeter su dung môt cá thê tinh cua lop Message, nên truoc khi môt cá thê cua lop
truoc có thê duoc tao ra, các lop sau này cung cân phai duoc nap.
Có nhiêu viêc xay ra bên trong JVM khi môt lop duoc nap và duoc khoi tao, bao gôm viêc giai mã dinh dang lop nhi
phân, kiêm tra tính tuong thích voi các lop khác, xác minh chuôi các phép toán bytecode và cuôi cùng là xây dung môt
cá thê java.lang.Class dê biêu diên lop moi. Dôi tuong Class này tro thành co so cho tât ca các cá thê cua lop
moi duoc JVM tao ra. Dó cung là trình dinh danh cho lop dã tu nap -- ban có thê có nhiêu ban sao cua cùng môt lop
nhi phân dã nap trong môt JVM, môi ban sao có cá thê Class riêng cua nó. Mác dù tât ca các ban sao này chia se cùng
môt tên lop, nhung chúng së là các lop riêng biêt voi JVM.
Tåt duòng dân (lóp) theo lôi mòn (beaten)
Các trình nap lop (class loaders) diêu khiên lop dang nap vào môt JVM. Có môt trình nap lop tu môi (bootstrap) duoc
xây dung bên trong JVM, nó có trách nhiêm nap các lop thu viên cua lop Java co ban. Trình nap lop dác biêt này có
môt sô tính náng dác biêt. Voi môt diêu là, nó chi nap các lop duoc tìm thây trên duong dân lop khoi dông. Boi vì dó
là nhung lop hê thông tin cây, trình nap bootstrap bo qua phân lon viêc xác nhân hop lê duoc thuc hiên cho các lop
}
}

pub11c c1ass Message
{
p¡1vafe 5f¡1ng m¸fexf¦

pub11c Message{5f¡1ng fexf} {
m¸fexf = fexf¦
}

pub11c vo1d p¡1nf{¸ava.1o.P¡1nf5f¡eam ps} {
ps.p¡1nf1n{m¸fexf}¦
}
}
|Opened /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¡f.¸a¡]
|Opened /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/sun¡sas1gn.¸a¡]
|Opened /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¸sse.¸a¡]
|Opened /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¸ce.¸a¡]
|Opened /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/cha¡sefs.¸a¡]
|Loaded ¸ava.1ang.Ob¸ecf f¡om /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¡f.¸a¡]
|Loaded ¸ava.1o.5e¡1a11zab1e f¡om /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¡f.¸a¡]
|Loaded ¸ava.1ang.Compa¡ab1e f¡om /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¡f.¸a¡]
|Loaded ¸ava.1ang.Cha¡5equence f¡om /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¡f.¸a¡]
|Loaded ¸ava.1ang.5f¡1ng f¡om /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¡f.¸a¡]
...
|Loaded ¸ava.secu¡1fy.P¡1nc1pa1 f¡om /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¡f.¸a¡]
|Loaded ¸ava.secu¡1fy.ce¡f.Ce¡f1f1cafe
f¡om /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¡f.¸a¡]
|Loaded Demo]
""beg1nn1ng execuf1on""
|Loaded G¡eefe¡]
|Loaded Message]
""c¡eafed G¡eefe¡""
he11o, Wo¡1d!
|Loaded ¸ava.uf11.hashMap$key5ef
f¡om /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¡f.¸a¡]
|Loaded ¸ava.uf11.hashMap$keylfe¡afo¡
f¡om /us¡/¸ava/¸2sdk1.4.1/¸¡e/11b/¡f.¸a¡]
Page 4 of 7 Dông luc hoc lâp trình Java, Phân 1: Các lop Java và viêc nap các lop
bình thuong (không tin cây).
Bootstrap không phai là trình nap lop duy nhât. Dôi voi nguoi moi bát dâu, môt JVM dinh nghia môt trình nap lop mo
rông (extension) dê nap các lop tu các API mo rông Java tiêu chuân và lop hê thông (system) dê nap các lop tu duong
dân lop chung (gôm ca các lop ung dung cua ban). Các ung dung cung có thê dinh nghia các trình nap lop riêng cua
chúng cho các muc dích dác biêt (cháng han nhu nap lai các lop trong thoi gian chay). Các trình nap lop duoc thêm
vào nhu vây có nguôn gôc tu lop java.lang.ClassLoader (có thê gián tiêp), lop này cung câp su hô tro côt lõi dê
xây dung môt su biêu diên lop trong môt cá thê java.lang.Class tu môt mang các byte. Môi lop duoc xây dung
theo môt sô ý nghia "có so huu" báng trình nap lop dã nap nó. Các trình nap lop thuong giu ban dô các lop mà chúng
dã nap, dê có kha náng tìm môt lop theo tên nêu nó duoc yêu câu lai.
Môi trình nap lop cung giu môt tham chiêu dên môt trình nap lop cha me, khi xác dinh môt cây cua các trình nap lop
voi trình nap bootstrap tai gôc. Khi cân môt cá thê cua môt lop dác biêt (duoc xác dinh theo tên), bât cu trình nap lop
nào lúc dâu xu lý yêu câu thuong kiêm tra trình nap lop cha me cua nó dâu tiên truoc khi cô gáng nap lop truc tiêp.
Diêu này áp dung theo cách dê quy nêu có nhiêu tâng cua các trình nap lop, sao cho nó có nghia là môt lop thuong së
nhìn thay không chi trong trình nap lop dã nap nó, mà còn cho tât ca các trình nap lop con cháu. Nó cung có nghia là
nêu môt lop có thê duoc nap boi nhiêu hon môt trình nap lop theo môt chuôi, môt lop xa nhât lên dên cây dó së là môt
lop nap nó thuc su.
Có rât nhiêu truong hop o dó các trình nap lop (classloaders) cua nhiêu ung dung duoc các chuong trình Java su dung.
Môt ví du là trong khung công tác J2EE. Môi ung dung J2EE duoc nap boi khung công tác cân phai có môt trình nap
lop riêng dê ngán chán các lop trong môt ung dung khoi can tro các ung dung khác. Mã cua khung công tác tu nó së su
dung môt hoác nhiêu trình nap lop khác, cung dê ngán chán su can tro dên hoác tu các ung dung. Tâp các trình nap lop
hoàn chinh tao nên môt hê thông phân câp có câu trúc cây voi các kiêu khác nhau cua các lop o môi câp.
Các cây cúa các trình nap
Nhu ví du cua môt hê thông phân câp cua môt trình nap lop trong lúc hành dông, Hình 1 cho thây hê thông phân câp
cua môt trình nap lop duoc máy servlet Tomcat xác dinh. O dây trình nap lop Chung (Common) nap tu các têp JAR
trong môt thu muc cu thê cua quá trình cài dát Tomcat dành cho nhung mã dùng chung giua máy chu và tât ca các ung
dung Web. Trình nap Catalina dành cho các lop riêng cua Tomcat và trình nap dùng chung (Shared) cho các lop duoc
chia se giua các ung dung Web. Cuôi cùng, môi ung dung Web nhân trình nap riêng cho các lop riêng cua nó.

Hình 1. Các trình nçp lóp Tomcat

Trong kiêu môi truong này, viêc theo dõi trình nap thích hop dê su dung cho yêu câu môt lop moi có thê lôn xôn. Do
diêu này, các phuong thuc setContextClassLoader và getContextClassLoader dã duoc thêm vào lop
java.lang.Thread trong nên tang Java 2. Các phuong thuc này cho phép khung công tác thiêt lâp trình nap lop së
duoc su dung cho môi ung dung trong lúc chay mã tu ung dung dó.
Tính linh hoat vê kha náng nap các tâp dôc lâp cua các lop là môt tính náng quan trong cua nên tang Java. Tuy nhiên,
khi tính náng này có ích, nó thê tao ra su lân lôn trong môt sô truong hop. Môt khía canh lân lôn là vân dê tiêp tuc dôi
phó voi các duong dân lop (classpaths) cua JVM. Trong phân câp Tomcat cua các trình nap lop dã chi ra trong Hình 1,
ví du, các lop duoc nap boi trình nap lop Common së không bao gio có kha náng truc tiêp truy câp (theo tên) các lop
duoc ung dung Web nap. Cách duy nhât dê liên kêt các lop này cùng nhau là thông qua viêc su dung các giao diên truc
quan cho ca hai tâp các lop. Trong truong hop này, diêu dó bao gôm javax.servlet.Servlet duoc servlet Java
triên khai thuc hiên.
Các vân dê có thê nay sinh khi mã duoc di chuyên giua các trình nap lop vì bât cu lý do nào. Ví du, khi J2SE 1.4 dã di
chuyên JAXP API dê xu lý XML trong su phân phôi chuân, nó dã tao ra các vân dê cho nhiêu môi truong, mà o dó các
ung dung truoc dó dã dua vào viêc nap các viêc thuc hiên dã chon theo các XML API riêng cua chúng. Voi J2SE 1.3,
Page 5 of 7 Dông luc hoc lâp trình Java, Phân 1: Các lop Java và viêc nap các lop
diêu này có thê duoc thuc hiên chi báng cách dát têp JAR thích hop trong duong dân lop cua nguoi su dung. Trong
J2SE 1.4, các phiên ban tiêu chuân cua các API này bây gio dang o trong duong dân lop cua các phân mo rông
(extensions), dê cho nhung duong dân này thuong së ghi dè lên bât ky su hiên diên cua viêc thuc hiên trong duong dân
lop cua nguoi su dung.
Các kiêu lân lôn khác cung có thê xay ra khi su dung các trình nap nhiêu lop. Hình 2 cho thây môt ví du vê biên dong
nhan dang lop xay ra khi môi môt giao diên và viêc thuc hiên có liên quan duoc nap boi hai trình nap lop riêng biêt.
Mác dù các tên và viêc triên khai thuc hiên mã nhi phân cua các giao diên và các lop dêu giông nhau, môt cá thê cua
môt lop tu môt trình nap có thê không duoc thua nhân khi triên khai thuc hiên giao diên tu trình nap khác. Su lân lôn
này có thê duoc giai quyêt trong Hình 2 báng cách di chuyên lop giao diên I vào vùng cua trình nap lop System. Vân
là hai cá thê riêng biêt cua lop A, nhung ca hai së triên khai thuc hiên cùng giao diên I.

Hình 2. Biên dçng nhçn dçng lóp




Kêt luân
Dinh nghia lop Java và dác ta JVM cùng xác dinh môt khung công tác vô cùng manh më dê láp ráp mã trong thoi gian
chay. Thông qua viêc su dung các trình nap lop, các ung dung Java có kha náng làm viêc voi nhiêu phiên ban cua các
lop, nêu khác di các lop này së gây ra các xung dôt. Tính linh hoat cua các trình nap lop thâm chí cho phép nap dông
lai mã dã sua dôi trong khi môt ung dung tiêp tuc thuc hiên.
Chi phí cho tính linh hoat cua nên tang Java trong linh vuc này là chi phí hoat dông cao hon môt chút khi bát dâu môt
ung dung. Hàng trám các lop riêng biêt cân phai duoc JVM nap truoc khi nó có thê bát dâu thuc hiên ngay ca nhung
mã ung dung don gian nhât. Chi phí khoi dông này thuong làm cho nên Java phù hop voi các ung dung kiêu máy chu,
chay lâu dài tôt hon dê su dung thuong xuyên hon cho các chuong trình nho. Các ung dung máy chu cung duoc huong
loi nhiêu nhât tu su linh hoat láp ráp mã trong thoi gian chay, vì vây không có gì ngac nhiên ráng nên tang Java dã tro
nên ngày càng thuân loi cho kiêu phát triên này.
Trong phân 2 cua loat bài này, tôi së trình bày môt gioi thiêu vê cách su dung môt khía canh khác cua các nên móng
náng dông cua nên tang Java: API phan chiêu (Reflection API). Su phan chiêu giúp cho viêc thuc thi mã cua ban truy
câp toi các lop thông tin bên trong. Dây có thê là môt công cu quan trong dê xây dung mã linh hoat, có thê duoc nôi
voi nhau trong thoi gian chay mà không cân bât ky các liên kêt mã nguôn nào giua các lop. Tuy nhiên, nhu voi hâu hêt
các công cu, ban cân phai biêt su dung nó khi nào và nhu thê nào dê có loi ích tôt nhât. Kiêm tra lai dê tìm hiêu các thu
thuât và các su thoa hiêp vê su phan chiêu hiêu qua trong Phân 2 cua Các dong luc hoc lap trình Java.


Tài nguyên
Page 6 of 7 Dông luc hoc lâp trình Java, Phân 1: Các lop Java và viêc nap các lop
Di tháng dên mã nguôn trong Ðàc ta máy ao Java (Java Virtual Machine Specification) voi các chi tiêt vê dinh
dang lop nhi phân, nap các lop và mã byte Java thuc tê.

Tìm hiêu tât ca các chi tiêt vê viêc xây dung các trình nap lop dác biêt riêng cua ban voi huong dân, "Hiêu biêt
vê các trình nap lop Java"cua Greg Travis (developerWorks, 04.2001).

Nhân duoc các chi tiêt vê Máy ao nghiên cuu Jikes (RVM- Jikes Virtual Machine), máy ao này duoc triên khai
thuc hiên trong ngôn ngu Java và duoc tu tao máy chu (có nghia là, mã Java cua nó tu chay trên dó mà không
dòi hoi môt máy ao thu hai).

Theo kip voi quá trình tao các thuôc tính sán có cho các nhà phát triên Java voi Java Specification Request
(JSR) 175 voi Môt kha náng siêu du liêu cho ngôn ngu lâp trình Java.

Tìm hiêu các chi tiêt vê du án máy chu Web cua ngôn ngu Java Apache Tomcat cua Quÿ Apache Software,
gôm ca các chi tiêt vê cách su dung trình nap lop Tomcat.

Tìm thêm hàng trám tài nguyên công nghê Java trên vùng công nghê Java cua developerWorks.


Ðôi nét vê tác giá







Dennis Sosnoski là môt nhà tu vân và nhà tro giúp dào tao chuyên vê các dich vu Web và SOA dua trên-Java. Kinh
nghiêm phát triên phân mêm chuyên nghiêp cua ông trai suôt hon 30 nám qua, voi môt thâp ki cuôi tâp trung vào các
công nghê XML và Java phía máy chu. Dennis là nhà phát triên hàng dâu vê dung cu liên kêt du liêu XML JiBX mã
nguôn mo, cung là môt nguoi có duyên no voi khung công tác cua các dich vu Web Apache Axis2. Ông cung là môt
trong nhung thành viên cua nhóm chuyên gia dác ta kÿ thuât cua Jax-WS 2.0 và JAXB 2.0. Xem trang web cua ông
dê có thông tin vê các dich vu dào tao và tu vân cua ông.
Page 7 of 7 Dông luc hoc lâp trình Java, Phân 1: Các lop Java và viêc nap các lop

You're Reading a Free Preview

Tải về
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->