Galian Telkom

Hmm.... ^_^

Wednesday, September 06, 2006

ClassLoader di java

Java merupakan penganut aliran "Lazy loading" yang berarti class baru akan diload ketika akan digunakan saja. Yang berperan untuk meload semua class adalah ClassLoader. Kita harus memberi tahu ClassLoader lokasi-lokasi class yang bisa diload dengan cara mengeset ClassPath. Berikut ini perilaku ClassLoader yang saya temukan ketika dia berhadapan dengan multiple ClassPath.

Rule 1 : Class akan diload secara runtime dan dicek secara satu persatu mulai dari path pertama. Begitu namanya match, langsung load class tersebut.

Contoh Kasus :
Misalkan urutan classpathnya adalah path1;path2;path3. Misalkan lagi ClassLoader kita suruh untuk memanggil method "baca" dari class "orang", maka pertama akan dicek di path1 apakah ada class bernama "orang". Jika tidak ada, cek path2, demikian seterusnya. Jika class ditemukan, panggil method "baca" dari class tersebut. Jika method tersebut tidak ada, maka terjadi NoSuchMethodError. Jika sampai path terakhir class belum juga ditemukan, maka terjadi NoClassDefError.
- di path1 tidak ada class "Orang". di path2 ada class "Orang" yang mempunyai method "baca". => Skenario sukses
- di path2 ada class "Orang", tapi tidak punya method "baca". di path2 ada class "Orang" yang punya method "baca". => NoSuchMethodError

Rule 2 : Superclass akan diload secara terpisah

Contoh Kasus :
di path1 ada class A, sementara di path2 ada class A dan class B dimana class B extends A. Misalkan class A mempunyai method "baca". Jika ClassLoader memanggil B.baca(), maka yang dipanggil adalah method "baca" dari class A yang ada di path1.
- Jika ternyata class A yang ada di path1 tidak mempunyai method "baca" => NoSuchMethodError.
- Jika ternyata di path1 tidak ada class bernama "A" dan di path2 ada class A yang mempunyai method "baca" => skenario sukses.

Rule 3 : Interface tidak diload secara runtime. Hanya dicek namanya saja.

Contoh Kasus :
di path1 ada interface "I" yang mempunyai method "haha" dan class A yang mengimplements interface I. Di path2 ada interface "I" yang mempunyai method "hoho" dan class B yang mengimplements interface I.
- Ketika kita panggil A.haha() dan B.hoho() => pemanggilan sukses
- pernyataan "A instanceof I" dan "B instanceof I" akan menghasilkan nilai TRUE.

Sepertinya masih ada beberapa rule lagi, namun saya sudah terlalu pusing untuk mengopreknya.

Kesimpulan : JANGAN PERNAH membuat nama class dan package yang sama di path / file jar yang berbeda. Bikin pusing!!!

3 Comments:

  • At 7:58 AM, Anonymous Anonymous said…

    Yaaa mari kita tuntut itu si pembuat XMOJO!
    dan juga Sun Microsystem yang masuk-masukin pakage javax.management ke jdk1.5 :P
    Huh! udah JDMK disuruh bayar! tipuw..

    Udah Bubarin Ajalahâ„¢

    ~wakakakak

     
  • At 1:01 AM, Anonymous Anonymous said…

    mantabh...
    galian telkom tutorial JAVA :D

     
  • At 4:04 PM, Anonymous Anonymous said…

    Eh iya baru sadar gw.
    Wah hebat nih telkom..
    bener-bener 'commited to you' deh awh

    ~spammm spamm

     

Post a Comment

<< Home