Apakah peranan ClassLoader di Java?



Artikel ini adalah panduan komprehensif mengenai bagaimana ClassLoader berfungsi di Java. Ia membincangkan jenis, prinsip dan kaedah ClassLoader di Java.

Semasa bekerja di Java, kami sering menggunakan sebilangan besar kelas. Kelas Java ini tidak dimuat sekaligus dalam memori, sebaliknya, dimuat apabila diperlukan oleh aplikasi. Di sinilah Java ClassLoaders masuk ke dalam gambar. Jadi dalam artikel ini, saya akan membincangkan cara menggunakan ClassLoader di Java bersama dengan contoh.

Topik berikut akan dibahas dalam artikel ini:





  1. Apa itu ClassLoader?
  2. Jenis ClassLoader
  3. Prinsip ClassLoader
  4. Kaedah ClassLoader
  5. Pemuat Kelas Tersuai

Mari kita mulakan!

Apa itu ClassLoader di Java?

ClassLoader di Java dipanggil oleh Java Runtime Environment untuk memuat kelas secara dinamis bila diperlukan oleh aplikasi di Mesin Maya Java . Oleh kerana ClassLoaders adalah bahagian dari Java Runtime Environment, Java Virtual Machine tidak akan mempunyai idea mengenai sistem fail dan fail yang mendasari.



Sekarang, mari kita fahami pelbagai jenis ClassLoaders terbina dalam Java.

Jenis ClassLoader di Java

Pelbagai jenis ClassLoaders di Java adalah seperti berikut:

Mari kita bincangkan masing-masing satu persatu.



Extension ClassLoader

Seperti namanya Extension ClassLoader memuatkan sambungan kelas inti Java dari JDK Perpustakaan peluasan. Ia adalah anak dari Bootstrap ClassLoader dan memuat sambungan dari direktori JRE / lib / teks atau direktori lain yang ditentukan dalam sifat sistem java.ext.dirs.

Aplikasi atau SystemLoader Sistem

Aplikasi atau System ClassLoader adalah anak dari Extension ClassLoader. Jenis ClassLoader ini memuat semua kelas tahap aplikasi yang terdapat dalam pilihan baris perintah -cp atau di dalam pemboleh ubah persekitaran CLASSPATH.

BootLap KelasLoader

Seperti yang kita semua tahu bahawa Kelas Java dimuat oleh contoh java.lang.ClassLoade. Tetapi, kerana ClassLoader adalah kelas, Bootstrap ClassLoader bertanggungjawab memuat kelas dalaman JDK. BootStrap ClassLoader adalah kod mesin yang memulakan operasi apabila JVM memanggilnya dan memuat kelas dari rt.jar. Oleh itu, anda dapat memahami bahawa Bootstrap ClassLoader yang dilayan tidak mempunyai ClassLoader induk dan dengan itu dikenali sebagai Primordial ClassLoader.

Catatan: Keutamaan Bootstrap lebih tinggi daripada Extension, dan keutamaan yang diberikan kepada Extension ClassLoader lebih tinggi daripada Application ClassLoader. Rujuk gambar di bawah:

persamaan antara java dan javascript

Jenis ClassLoader - ClassLoader di Java - Edureka

Selanjutnya dalam artikel ini, mari kita memahami prinsip-prinsip di mana ClassLoader berfungsi.

Prinsip ClassLoader di Java

Kumpulan peraturan berdasarkan JavaLoader berfungsi adalah tiga prinsip berikut:

Marilah kita memahami masing-masing.

Harta Keunikan

Properti ini memastikan bahawa tidak ada pengulangan kelas dan semua kelas adalah unik. Properti keunikan juga memastikan bahawa kelas dimuat oleh ClassLoader induk tidak dimuat oleh ClassLoader anak. Dalam senario, di mana ClassLoader induk tidak dapat mencari kelas, maka contoh semasa akan berusaha melakukannya dengan sendirinya.

Model Perwakilan

ClassLoader di Java berfungsi berdasarkan set operasi yang diberikan oleh Model Delegasi. Jadi, setiap kali permintaan dihasilkan untuk mencari kelas atau sumber, maka contoh ClassLoader akan mewakilkan pencarian kelas atau sumber tersebut kepada ClassLoader induk.

Kumpulan operasi berdasarkan ClassLoader berfungsi adalah seperti berikut:

  • Mesin Maya Java memeriksa sama ada kelas dimuat atau tidak, bila-bila masa di kelas.
  • Sekiranya kelas dimuatkan JVM diteruskan dengan pelaksanaan kelas, tetapi dalam senario di mana kelas tidak dimuat, makaJVM meminta sub-sistem Java ClassLoader memuatkan kelas tertentu itu. Selepas itu, sub-sistem ClassLoader memberikan kawalan kepada Application ClassLoader.
  • Application ClassLoader kemudian mendelegasikan permintaan itu ke Extension ClassLoader, yang setelah itu menyampaikan permintaan tersebut ke Bootstrap ClassLoader.
  • Sekarang, Bootstrap ClassLoader mencari diBootstrap classpath untuk memeriksa sama ada kelas tersedia atau tidak. Sekiranya kelas tersedia, maka dimuat, jika tidak, permintaan itu sekali lagi diteruskan ke Extension ClassLoader.
  • Extension ClassLoader memeriksa kelas di lanjutan classpath.Sekiranya kelas tersedia, maka dimuat, jika tidak, permintaan itu akan diserahkan lagi ke Application ClassLoader.
  • Akhirnya, Application ClassLoader mencari kelas di classpath aplikasi.Sekiranya kelas tersedia, kemudian dimuat, jika tidak, anda akan melihat pengecualian dari ClassNotFoundException.

Rujuk gambar di bawah.

Prinsip Penglihatan

Menurut prinsip ini, kelas anak-anak dapat dilihat oleh kelas yang dimuatkan oleh ClassLoaders induknya, tetapi sebaliknya tidak benar. Jadi, kelas yang dimuat oleh Application ClassLoader mempunyai keterlihatan ke kelas yang dimuat oleh Extension dan Bootstrap ClassLoader.

Sebagai contoh, jika kita mempunyai dua kelas: A & B, anggap bahawa kelas A dimuat oleh Application ClassLoader dan kelas B dimuat oleh Extensions ClassLoader. Di sini, kelas A dan B dapat dilihat oleh semua kelas yang dimuat oleh Application ClassLoader, tetapi kelas B hanya dapat dilihat oleh kelas yang dimuat oleh Extension ClassLoader.

Juga, jika anda cuba memuat kelas-kelas ini menggunakan Bootstrap ClassLoader, anda akan melihatnya java.lang.ClassNotFoundException . pengecualian.

Baiklah, setelah anda mengetahui jenis ClassLoaders dan prinsip-prinsip di belakangnya, mari kita teliti beberapa kaedah pentingdaripada java.lang.ClassLoader kelas.

Kaedah ClassLoader di Java

Sedikit mustahak ClassLoader adalah seperti berikut:

loadClass (Nama rentetan, penyelesaian boolean)

Kaedah ini adalah titik masuk ClassLoader dan digunakan untuk memuatkan kelas yang dirujuk oleh JVM. Ia mengambil nama sebagai parameter. JVM memanggil kaedah loadClass () untuk menyelesaikan rujukan kelas dengan menetapkan nilai boolean ke true. Hanya jika kita perlu menentukan sama ada kelas itu wujud atau tidak, parameter boolean ditetapkan ke false.

Pengisytiharan:

public Class loadClass (String name, boolean resolution) melemparkan ClassNotFoundException {

defineClass ()

Kaedah terakhir yang digunakan untuk menentukan array byte sebagai contoh kelas. Sekiranya kelas tidak sah maka, ia akan membuang ClassFormatError.

Pengisytiharan:

Kelas akhir yang dilindungi defineClass (String name, byte [] b, int off, int len) membuang ClassFormatError

findClass (Nama rentetan)

Kaedah findClass digunakan untuk mencari kelas yang ditentukan. Oleh itu, ia hanya menemui kelas dengan nama yang layak sepenuhnya sebagai parameter tetapi tidak memuatkan kelas. Kaedah loadClass () memanggil kaedah ini jika ClassLoader induk tidak dapat mencari kelas yang diminta. Juga, jika tidak ada ibu bapa dari ClassLoader yang menjumpai kelas, pelaksanaan lemparan lalai ClassNotFoundException.

Pengisytiharan:

dilindungi Class findClass (String name) membuang ClassNotFoundException

Class.forName (Nama rentetan, inisialisasi boolean, pemuat ClassLoader)

Kaedah ini digunakan untuk memuat dan memulakan kelas. Ini memberikan pilihan untuk memilih salah satu ClassLoader dan jika parameter ClassLoader adalah NULL, maka secara automatik BootLap ClassLoader digunakan.

Pengisytiharan:

Kelas forName statik awam (String name, boolean initialize, ClassLoader loader) melemparkan ClassNotFoundException

getParent ()

Kaedah getParent digunakan untuk mengembalikan ClassLoader induk untuk perwakilan.

Pengisytiharan:

getParent KelasLoader akhir awam ()

getResource ()

Seperti namanya, kaedah getResource () cuba mencari sumber dengan nama yang diberikan. Pada mulanya ia akan menyerahkan permintaan tersebut kepada ClassLoader induk untuk mendapatkan sumber. Sekiranya ibu bapa tidak sah, maka laluan ClassLoader yang dibina ke dalam JVM dicari. Sekarang, jika ini gagal, maka kaedah akan memanggil findResource (String) untuk mencari sumber, di mana nama sumber ditentukan sebagai input yang boleh menjadi jalan kelas mutlak atau relatif. Kemudian, ia mengembalikan objek URL untuk membaca sumber atau mengembalikan nilai nol jika sumber tidak mempunyai keistimewaan yang mencukupi untuk mengembalikan sumber atau tidak dijumpai.

Pengisytiharan:

getResource URL awam (Nama rentetan)

Selanjutnya, dalam artikel ini mengenai ClassLoader di Java, mari kita memahami Custom ClassLoader.

Custom ClassLoader di Java

ClassLoaders yang terbina dalam akan menguruskan kebanyakan kes di mana fail sudah ada dalam sistem fail, tetapi jika anda ingin memuatkan kelas dari cakera keras tempatan maka anda perlu memanfaatkan ClassLoaders tersuai.

Buat Pemain Kelas Tersuai

Untuk membuat ClassLoader tersuai, anda perlu memanjangkan Pemuat Kelas kelas dan mengatasi cariKelas () kaedah:

Contoh: Mari kita buat ClassLoader khusus yang memperluas ClassLoader lalai dan memuatkan array bait dari fail yang ditentukan. Rujuk kod di bawah.

pakej edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream kelas awam Contoh meluaskan ClassLoader {@Override public Class findClass (String samplename) melemparkan ClassNotFoundException {byte [] bFustomFoadClass (samplename) return defineClass (samplename, b, 0, b.length)} bait peribadi [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 cubalah {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () penyangga kembali}}

Dengan ini, kita mengakhiri artikel ini mengenai ClassLoader di Java. Saya harap anda memahami apa itu ClassLoaders di Java, kaedahnya, pelbagai jenis ClassLoaders, dll.

Jika anda menemukan artikel ini di 'ClassLoader in Java', periksa oleh Edureka, sebuah syarikat pembelajaran dalam talian yang dipercayai dengan rangkaian lebih daripada 250,000 pelajar berpuas hati yang tersebar di seluruh dunia. Kami di sini untuk membantu anda dalam setiap langkah dalam perjalanan anda, kerana selain daripada soalan wawancara java ini, kami menyediakan kurikulum yang dirancang untuk pelajar dan profesional yang ingin menjadi Jawa Pemaju.

Ada soalan untuk kami? Sila sebutkan di bahagian komen “ClassLoader in Java” ini ' dan kami akan menghubungi anda secepat mungkin.