Rumah  >  Artikel  >  Java  >  Dalam senario apakah NoSuchFieldException berlaku di Java?

Dalam senario apakah NoSuchFieldException berlaku di Java?

WBOY
WBOYasal
2023-06-25 11:51:241649semak imbas

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:

  1. Mengakses medan yang tidak ditentukan

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 .

  1. Mengakses medan bukan awam

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.

  1. Mengakses pemalar statik

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn