NoSuchFieldException dalam Java merujuk kepada pengecualian yang dilemparkan apabila cuba mengakses medan yang tidak wujud (Field) semasa refleksi. Di Java, refleksi membolehkan kami memanipulasi kelas, kaedah, pembolehubah, dll. dalam atur cara melalui kod, menjadikan atur cara lebih fleksibel dan berskala. Walau bagaimanapun, apabila menggunakan refleksi, jika medan yang diakses tidak wujud, NoSuchFieldException akan dibuang.
NoSuchFieldException biasanya berlaku dalam senario berikut:
Apabila kita menggunakan refleksi untuk mengakses medan yang tidak wujud dalam kelas, NoSuchFieldException akan dibuang. Sebagai contoh, dalam kod berikut, kami cuba mengakses medan "foo" yang tidak ditentukan:
public class Test { public static void main(String[] args) { try { Class<?> myClass = Class.forName("example.MyClass"); Field myField = myClass.getField("foo"); // 抛出NoSuchFieldException异常 } catch (Exception e) { e.printStackTrace(); } } }
Memandangkan medan "foo" tidak wujud dalam kelas "example.MyClass", pengecualian NoSuchFieldException dicetuskan apabila mengakses medan .
Sesetengah medan hanya boleh diakses dalam kelas yang sama. Jika kami cuba mengakses medan ini menggunakan refleksi, NoSuchFieldException akan dibuang. Sebagai contoh, dalam kod berikut, kami cuba mengakses medan peribadi "bar" menggunakan refleksi:
public class Test { public static void main(String[] args) { try { MyClass myObject = new MyClass(); Field myField = MyClass.class.getDeclaredField("bar"); // 抛出NoSuchFieldException异常 myField.setAccessible(true); myField.set(myObject, "new_value"); } catch (Exception e) { e.printStackTrace(); } } } class MyClass { private int bar; }
Memandangkan medan "bar" adalah peribadi, kami mesti menetapkan kebolehcapaiannya kepada benar dahulu sebelum kami boleh mengaksesnya melalui refleksi. Walau bagaimanapun, sebelum kami mengakses medan tersebut, kami telah menggunakan kaedah getDeclaredField() untuk cuba mendapatkan medan tersebut Memandangkan medan tersebut bukan awam, pengecualian NoSuchFieldException akan dicetuskan apabila mengakses.
Di Java, pemalar statik (Akhir statik) ialah nilai yang ditentukan semasa penyusunan, jadi ia tidak boleh diubah pada masa jalan. Jika kita menggunakan refleksi untuk mengakses pemalar statik, NoSuchFieldException tidak akan berlaku, tetapi IllegalAccessException akan dilemparkan apabila cuba mengubah suai nilainya. Contohnya, dalam kod berikut, kami cuba mengubah suai pemalar statik menggunakan pantulan:
class MyClass { public static final String FOO = "foo"; } public class Test { public static void main(String[] args) { try { Field myField = MyClass.class.getField("FOO"); myField.set(null, "bar"); // 抛出IllegalAccessException异常 } catch (Exception e) { e.printStackTrace(); } } }
Memandangkan medan "FOO" dalam kelas MyClass ialah pemalar statik, jika kami cuba mengubah suainya menggunakan pantulan, IllegalAccessException akan menjadi dilemparkan. Walau bagaimanapun, apabila mengakses pemalar statik, NoSuchFieldException tidak akan dicetuskan.
Apabila menggunakan refleksi, kita harus memberi perhatian kepada pengecualian yang mungkin berlaku dalam senario di atas dan mengendalikannya dengan munasabah supaya program dapat dilaksanakan dengan lancar. Pada masa yang sama, kita juga perlu ambil perhatian bahawa apabila menggunakan refleksi untuk mengakses medan bukan awam, kita harus menetapkan kebolehaksesannya kepada benar dahulu, jika tidak akses akan dinafikan dan IllegalAccessException akan dibuang.
Atas ialah kandungan terperinci Dalam senario apakah NoSuchFieldException berlaku di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!