Menyelidiki Perbezaan antara Class.getResource() dan ClassLoader.getResource()
Perbezaan antara Class.getResource() dan ClassLoader .getResource() terletak pada tafsiran sumber nama.
Nama Sumber Relatif lwn. Mutlak
Class.getResource() menerima kedua-dua nama sumber "relatif" dan "mutlak". Apabila menggunakan nama relatif, sumber ditafsirkan secara relatif kepada pakej kelas. Sebaliknya, ClassLoader.getResource() sentiasa menganggap laluan mutlak.
Untuk menggambarkan ini:
foo.bar.Baz.class.getResource("xyz.txt"); // relative name foo.bar.Baz.class.getClassLoader().getResource("foo/bar/xyz.txt"); // equivalent
Slash Terkemuka
Dalam konteks Class.getResource(), nama sumber yang diawali dengan garis miring ("/") dianggap mutlak. Ini adalah untuk menyelaraskan dengan gelagat yang dijangkakan apabila berurusan dengan sistem fail sebenar.
foo.bar.Baz.class.getResource("/data/xyz.txt"); // absolute name foo.bar.Baz.class.getClassLoader().getResource("data/xyz.txt"); // also absolute
Caching:
Bagi soalan anda mengenai caching, anda betul dalam pemerhatian anda . Penyenaraian direktori dicache oleh ClassLoader, tetapi bukan oleh Class.getResource(). Ini boleh membawa kepada senario di mana fail atau perubahan direktori yang baru dibuat mungkin tidak dapat dilihat dengan serta-merta menggunakan Class.getResource() tetapi boleh dilihat melalui ClassLoader.getResource().
Dokumentasi API untuk Class.getResource() mengesahkan tingkah laku ini:
"Kaedah ini mewakilkan kepada pemuat kelas objek ini. Jika objek ini dimuatkan oleh pemuat kelas bootstrap, kaedah mewakilkan kepada ClassLoader.getSystemResource(java.lang.String)."
Cadangan
Secara umum, disyorkan untuk menggunakan ClassLoader.getResource() jika anda perlukan untuk mengakses sumber yang mungkin tidak terdapat dalam pakej kelas. Walau bagaimanapun, jika anda secara khusus bekerja dengan sumber yang berkaitan dengan pakej kelas dan inginkan gambaran segera perubahan direktori, anda boleh menggunakan Class.getResource() sambil mengambil kira had cachingnya.
Atas ialah kandungan terperinci Class.getResource() vs. ClassLoader.getResource(): Apakah Perbezaannya dan Bilakah Saya Perlu Menggunakan Mana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!