Apa peran ClassLoader di Java?



Artikel ini adalah panduan lengkap tentang cara kerja ClassLoader di Java. Ini membahas jenis, prinsip dan metode ClassLoader di Jawa.

Saat bekerja di Java, kami sering menggunakan banyak kelas. Kelas-kelas Java ini tidak dimuat sekaligus di memori, melainkan dimuat saat diperlukan oleh aplikasi. Di sinilah Java ClassLoaders masuk ke dalam gambar. Jadi pada artikel kali ini, saya akan membahas bagaimana cara menggunakan ClassLoader di Java beserta contohnya.

Topik berikut akan dibahas dalam artikel ini:





  1. Apa itu ClassLoader?
  2. Jenis ClassLoader
  3. Prinsip ClassLoader
  4. Metode ClassLoader
  5. ClassLoader Kustom

Mari kita mulai!

Apa itu ClassLoader di Java?

ClassLoader di Java dipanggil oleh Java Runtime Environment untuk memuat kelas secara dinamis setiap kali diperlukan oleh aplikasi di Mesin Virtual Java . Karena ClassLoaders adalah bagian dari Java Runtime Environment, Java Virtual Machine tidak akan mengetahui tentang file dan sistem file yang mendasarinya.



Sekarang, mari kita pahami berbagai jenis ClassLoader bawaan di Java.

apa kerangka pegas

Jenis ClassLoader di Java

Berbagai jenis ClassLoader di Java adalah sebagai berikut:

Mari kita bahas satu per satu.



Ekstensi ClassLoader

Seperti namanya, Extension ClassLoader memuat ekstensi kelas inti Java dari JDK Perpustakaan ekstensi. Ini adalah anak dari Bootstrap ClassLoader dan memuat ekstensi dari direktori JRE / lib / teks atau direktori lain yang ditentukan dalam properti sistem java.ext.dirs.

Aplikasi atau System ClassLoader

Aplikasi atau System ClassLoader adalah anak dari Extension ClassLoader. Jenis ClassLoader ini memuat semua kelas tingkat aplikasi yang ditemukan di opsi baris perintah -cp atau int variabel lingkungan CLASSPATH.

Bootstrap ClassLoader

Seperti yang kita semua tahu Kelas Java dimuat oleh instance java.lang.ClassLoade. Tapi, karena ClassLoader adalah kelas, Bootstrap ClassLoader bertanggung jawab untuk memuat kelas internal JDK. BootStrap ClassLoader adalah kode mesin yang memulai operasi saat JVM memanggilnya dan memuat kelas dari rt.jar. Jadi, Anda dapat memahami bahwa Bootstrap ClassLoader melayani tidak memiliki ClassLoader induk dan oleh karena itu dikenal sebagai Primordial ClassLoader.

catatan: Prioritas Bootstrap lebih tinggi dari Ekstensi, dan prioritas yang diberikan ke Extension ClassLoader lebih tinggi dari Application ClassLoader. Lihat gambar di bawah ini:

Jenis ClassLoader - ClassLoader di Jawa - Edureka

Selanjutnya dalam artikel ini, mari kita memahami prinsip-prinsip yang digunakan ClassLoader bekerja.

Prinsip ClassLoader di Java

Kumpulan aturan yang didasarkan pada Java ClassLoader bekerja adalah tiga prinsip berikut:

Mari kita pahami masing-masing.

Keunikan Properti

Properti ini memastikan bahwa tidak ada pengulangan kelas dan semua kelas unik. Properti keunikan juga memastikan bahwa kelas yang dimuat oleh ClassLoader induk tidak dimuat oleh ClassLoader anak. Dalam skenario, di mana ClassLoader induk tidak dapat menemukan kelas, maka instance saat ini akan mencoba melakukannya dengan sendirinya.

Model Delegasi

ClassLoader di Java bekerja berdasarkan set operasi yang diberikan oleh Model Delegasi. Jadi, setiap kali permintaan dibuat untuk menemukan kelas atau sumber daya, maka instance ClassLoader akan mendelegasikan pencarian kelas atau sumber daya tersebut ke induk ClassLoader.

Kumpulan operasi yang didasarkan pada ClassLoader bekerja adalah sebagai berikut:

  • Java Virtual Machine memeriksa apakah kelas tersebut dimuat atau tidak, setiap kali ia menemukan kelas.
  • Dalam kasus di mana kelas dimuat JVM melanjutkan dengan eksekusi kelas, tetapi dalam skenario di mana kelas tidak dimuat, makaJVM meminta sub-sistem Java ClassLoader untuk memuat kelas tertentu itu. Setelah itu, sub-sistem ClassLoader memberikan kontrol ke Application ClassLoader.
  • Application ClassLoader kemudian mendelegasikan permintaan tersebut ke Extension ClassLoader, yang kemudian meneruskan permintaan tersebut ke Bootstrap ClassLoader.
  • Sekarang, Bootstrap ClassLoader mencari fileJalur kelas bootstrap untuk memeriksa apakah kelas tersedia atau tidak. Jika kelas tersedia, maka itu akan dimuat, jika tidak permintaan diteruskan lagi ke Extension ClassLoader.
  • Extension ClassLoader memeriksa kelas di jalur kelas ekstensi.Jika kelas tersedia, maka itu dimuat, jika tidak, permintaan akan diteruskan lagi ke Application ClassLoader.
  • Terakhir, Application ClassLoader mencari kelas di jalur kelas aplikasi.Jika kelas tersedia, maka dimuat, jika tidak, Anda akan melihat pengecualian ClassNotFoundException.

Lihat gambar di bawah.

Prinsip Visibilitas

Menurut prinsip ini, kelas anak-anak terlihat oleh kelas yang dimuat oleh ClassLoader induknya, tetapi sebaliknya tidak benar. Jadi, kelas yang dimuat oleh Application ClassLoader memiliki visibilitas ke dalam kelas yang dimuat oleh Extension dan Bootstrap ClassLoader.

Misalnya, jika kita memiliki dua kelas: A & B, asumsikan bahwa kelas A dimuat oleh Application ClassLoader dan kelas B dimuat oleh Extensions ClassLoader. Di sini, kelas A dan B terlihat oleh semua kelas yang dimuat oleh Application ClassLoader, tetapi kelas B hanya terlihat untuk kelas yang dimuat oleh Extension ClassLoader.

Selain itu, jika Anda mencoba memuat kelas ini menggunakan Bootstrap ClassLoader, Anda akan melihat file java.lang.ClassNotFoundException . pengecualian.

Baiklah, sekarang setelah Anda mengetahui jenis ClassLoader dan prinsip di baliknya, mari kita lihat beberapa metode penting.dari java.lang.ClassLoader kelas.

Metode ClassLoader di Java

Sedikit yang penting ClassLoader adalah sebagai berikut:

loadClass (Nama string, penyelesaian boolean)

Metode ini adalah titik masuk ClassLoader dan digunakan untuk memuat kelas yang dirujuk oleh JVM. Ini mengambil nama sebagai parameter. JVM memanggil metode loadClass () untuk menyelesaikan referensi kelas dengan menyetel nilai boolean ke true. Hanya jika kita perlu menentukan apakah kelas tersebut ada atau tidak, parameter boolean disetel ke false.

Pernyataan:

public Class loadClass (Nama string, penyelesaian boolean) melempar ClassNotFoundException {

defineClass ()

Metode terakhir yang digunakan untuk mendefinisikan array byte sebagai turunan kelas. Jika kelas tersebut tidak valid, maka ClassFormatError akan dilempar.

Pernyataan:

Kelas akhir yang dilindungi defineClass (Nama string, byte [] b, int off, int len) melempar ClassFormatError

findClass (nama string)

Metode findClass digunakan untuk menemukan kelas yang ditentukan. Jadi, ia hanya menemukan kelas dengan nama yang memenuhi syarat sebagai parameter tetapi tidak memuat kelas tersebut. Metode loadClass () memanggil metode ini jika ClassLoader induk tidak dapat menemukan kelas yang diminta. Selain itu, jika tidak ada induk ClassLoader yang menemukan kelas tersebut, implementasi default akan melontarkan file ClassNotFoundException.

Pernyataan:

Kelas yang dilindungi findClass (nama string) melempar ClassNotFoundException

Class.forName (Nama string, inisialisasi boolean, loader ClassLoader)

Metode ini digunakan untuk memuat dan menginisialisasi kelas. Ini memberikan opsi untuk memilih salah satu ClassLoaders dan memetikan parameter ClassLoader adalah NULL, kemudian secara otomatis Bootstrap ClassLoader digunakan.

Pernyataan:

public static Class forName (Nama string, inisialisasi boolean, loader ClassLoader) melempar ClassNotFoundException

getParent ()

Metode getParent digunakan untuk mengembalikan ClassLoader induk untuk didelegasikan.

Pernyataan:

public final ClassLoader getParent ()

getResource ()

Seperti namanya, metode getResource () mencoba mencari sumber daya dengan nama yang diberikan. Ini awalnya akan mendelegasikan permintaan ke ClassLoader induk untuk sumber daya. Jika induknya null, maka jalur ClassLoader yang dibangun ke dalam JVM akan dicari. Sekarang, jika ini gagal, maka metode akan memanggil findResource (String) untuk menemukan sumber daya, di mana nama sumber daya ditetapkan sebagai masukan yang dapat berupa jalur kelas absolut atau relatif. Kemudian, ia mengembalikan objek URL untuk membaca sumber daya atau mengembalikan nilai null jika sumber daya tidak memiliki hak yang memadai untuk mengembalikan sumber daya atau tidak ditemukan.

Pernyataan:

URL publik getResource (nama string)

Selanjutnya, pada artikel ClassLoader di Java ini, mari kita pahami Custom ClassLoader.

ClassLoader Kustom di Java

ClassLoaders bawaan akan menangani sebagian besar kasus di mana file sudah ada di sistem file, tetapi jika Anda ingin memuat kelas dari hard drive lokal, Anda perlu menggunakan ClassLoader kustom.

Buat ClassLoader Kustom

Untuk membuat ClassLoader kustom, Anda perlu memperluas ClassLoader kelas dan timpa findClass () metode:

Contoh: Mari kita buat ClassLoader kustom yang memperluas ClassLoader default dan memuat array byte dari file yang ditentukan. Lihat kode di bawah ini.

paket edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Contoh extends ClassLoader {@Override public Class findClass (String samplename) melempar ClassNotFoundException {byte [] b = customLoadClassFromFile (samplename) kembali defineClass (samplename, b, 0, b.length)} byte pribadi [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 coba {sementara ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

Dengan ini, kami mengakhiri artikel ini di ClassLoader di Java. Saya harap Anda mengerti apa itu ClassLoader di Java, metodenya, berbagai jenis ClassLoader, dll.

Jika Anda menemukan artikel ini di 'ClassLoader di Java', lihat oleh Edureka, perusahaan pembelajaran online tepercaya dengan jaringan lebih dari 250.000 pelajar yang puas dan tersebar di seluruh dunia. Kami di sini untuk membantu Anda dengan setiap langkah dalam perjalanan Anda, untuk menjadi selain pertanyaan wawancara java ini, kami datang dengan kurikulum yang dirancang untuk siswa dan profesional yang ingin menjadi Jawa Pengembang.

Ada pertanyaan untuk kami? Harap sebutkan di bagian komentar “Pemuat Kelas di Java ' dan kami akan menghubungi Anda kembali secepatnya.