Artikel ini terutama mempelajari konten yang relevan dari pemuatan dinamis Java dari file JAR dan kelas, sebagai berikut.
File kelas memuat di java adalah dinamis. Dengan kata lain, kami hanya akan memuat saat kami menggunakannya, dan jika kami tidak menggunakannya, kami tidak akan memuat kelas kami.
Java memberi kita dua mekanisme dinamis. Yang pertama adalah mekanisme implisit. Yang kedua adalah mekanisme tampilan. sebagai berikut:
Dua metode:
Metode class.forname () memiliki dua bentuk:
public static Class forName(String className)public static Class forName(String className, boolean initialize,ClassLoader loader) Memanggil metode forname () dengan hanya satu parameter yang setara dengan class.forname (classname, true, loader).
Kedua metode harus dihubungkan ke metode asli forname0 () di akhir.
FORNAME () dengan tiga parameter, panggilan terakhir adalah: forname0 (nama, inisialisasi, loader);
Apakah Anda menggunakan baru untuk membuat kelas tertentu, atau menggunakan metode class.forname () dengan hanya satu parameter, langkah -langkah "Memuat kelas + blok kode statis yang berjalan" tersirat di dalam.
Saat menggunakan metode class.forname () dengan tiga parameter, jika parameter kedua salah, class loader hanya akan memuat kelas dan tidak akan menginisialisasi blok kode statis. Hanya ketika kelas dipakai, blok kode statis akan diinisialisasi. Blok kode statis diinisialisasi ketika kelas dipakai untuk pertama kalinya.
ClassLoader digunakan untuk memuat kelas. Ketika kelas dimuat, semua kelas yang dirujuk oleh kelas ini juga akan dimuat, dan pemuatan ini bersifat rekursif. Artinya, jika A mengacu pada B dan B mengacu pada C, maka ketika A dimuat, B juga akan dimuat, dan ketika B dimuat, C juga akan dimuat. Rekursif sehingga semua yang diperlukan kelas memuat dengan baik.
Paket com.demo.test; import java.io.bytearrayoutputStream; import java.io.file; import java.io.fileinputStream; java.lang.reflect.invocationTargetException; impor java.lang.reflect.method; impor java.net.malformedlexception; impor java.net.url; classeplufoughyerer {java lainnya, java {java.urlsclasserer; public class dinynydoaddemo {enum lain ClassLoader {public synchronized Class<?> loadClass(String name, File file) throws FileNotFoundException {Class<?> cls = findLoadedClass(name);if(cls != null) {return cls;}FileInputStream fis = new FileInputStream(file);ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = byte baru [1024]; int len; coba {while (true) {len = fis.read (buffer); if (len == -1) {break;} Baos.write (buffer, 0, len);} // FileInputStream's flush adalah operasi kosong, karena flush adalah fungsi dari hal -hal yang ditulis dalam hal -hal dalam hal -hal dalam hal -hal dalam hal -hal yang dalam CUREITSTREAM adalah operasi kosong, karena FLUSH adalah fungsi dari hal -hal yang menulis hal -hal dalam hal -hal dalam hal -hal dalam berbagai hal dalam operasi yang kosong, karena flush adalah fungsi dari hal -hal. Tidak perlu di sini jadi kosong. //baos.flush (); byte [] data = Baos.tobyteArray (); return Defineclass (null, data, 0, data.length);} catch (ioException e) {e.printstacktrace ();} akhirnya {try {baos.close ();} tangkap {{try {baos.close (); {fis.close ();} catch (ioException e) {e.printstacktrace ();}} return null;}} public static void main (string [] args) {string classname = "com.demo.test.helloworld"; string paths [] = {"hellowor" hellow "hellow"; jalur) {string lowerpath = path.tolowercase (); filetype filetype = filetype.other; if (lowerpath.endswith (". jar") || lowerpath.endswith (". == filetype.other) {return;} file file = file baru (path); if (! File.exists ()) {return;} coba {url url = file.touri (). Tourl (); System.out.println (url.tostring ()); class <? URLClassLoader(new URL[] { url }, Thread.currentThread().getContextClassLoader());cls = classLoader.loadClass(className);break;case CLASS: MyClassLoader myClassLoader = new MyClassLoader();cls = myClassLoader.loadClass(className, file);break;default: break;}if (cls == null) {return;} // Instance Variable Field Field = cls.getDecledField ("hello"); if (! field.isAccessible ()) {field.setAccessible (true);} System.out.println (field.get (cls.newinstance ());// panggil metode statis tanpa parameter Metticmeter (cls.newinstance ()); cls.getDeclaredMethod ("saystatichello", null); if (! staticmethod.isAccessible ()) {staticmethod.setAccessible (true);} // Jika nilai pengembalian fungsi tersebut batal, nullstaticmethod.invoke (cls, null); // Metode Metode dengan parameter Metode = cls.getDECLEDMETHOD ("Say", string ", string. {Method.setAccessible (true);} objek ret = method.invoke (cls.newinstance (), "Hello World"); System.out.println (ret);} catch (Malformedurlexception e) {e.printstacktrace ();} catch (classnotfoundException e) {E.PrintScrace (); {E.PrintStackTrace ();} catch (SecurityException e) {e.printstacktrace ();} catch (IllegalAccessException e) {e.printstacktrace ();} catch (IllegalArgumentException E) {E.PrintStackRace ();} catch (}} {e.printsceptack ();} n (} {e.printscepteCkor (); (InstantiationException e) {e.printstacktrace ();} catch (nosuchfieldException e) {e.printstacktrace ();} catch (filenotfoundException e) {e.printstacktrace ();}}}}hasil:
Di atas adalah semua konten dari artikel ini tentang analisis stoples pemuatan dinamis Java dan instance file kelas. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!