Pertama sekali, anda perlu memahami apa yang dilakukan oleh kaedah invoke dan penggunaan khususnya. Sebenarnya, anda perlu mengetahui fail kelas mana ia berada dalam kod sumber dan pakej mana ia berada, dan mengesan sumbernya.
Kaedah invoke berasal daripada kelas Kaedah dan mungkin tidak digunakan sebanyak kelas pembalut jenis asas yang sering kami gunakan, serta kelas koleksi dan kelas sambungan dan utilitinya.
Tetapi pakej di mana kelas Kaedah terletak adalah Refleks pantulan yang terkenal Jika tidak ada yang mengatakan bahawa Java tidak mempunyai refleksi, maka banyak rangka kerja tidak akan wujud.
Kami sering mencipta objek baharu, tetapi premis baharu ialah anda tahu objek yang anda perlukan sebelum anda boleh mencipta baharu Namun, terdapat perkara yang tidak diketahui dalam kedua-dua kod dan kehidupan sebenar, iaitu sehingga program itu berjalan, ia tertakluk kepada syarat Hanya selepas itu anda tahu kelas apa dan kaedah apa.
Refleksi menyelesaikan masalah ini dengan mendapatkan struktur objek dan kaedah panggilan pada masa jalan.
Kelas Kaedah adalah mengenai kaedah panggilan reflektif
Gambar berikut ialah anotasi rasmi kelas Kaedah
Mungkin ia bermaksud untuk menyediakan maklumat kaedah kelas atau antara muka Anda boleh mengakses dan memanggil kaedah yang sepadan.
Invoke bermaksud memanggil, yang bermaksud kita boleh memanggil kaedah invoke melalui kelas Kaedah di bawah pakej refleksi, memanggil kaedah yang kami sediakan dan parameter kaedah panggilan untuk melengkapkan panggilan dinamik.
Iaitu, ia dipanggil berdasarkan objek/contoh, nama kaedah dan parameter yang anda berikan. Cari "pengganti" untuk membantu anda memanggil kaedah tersebut.
2 Penggunaan kaedah invoke
Malah, penggunaan kaedah invoke adalah berbeza daripada apa yang biasa kita lihat.
Kami sering mencipta objek A, kaedah getA() dalam objek A, dan kemudian A.getA()
Kami menggunakan cara baharu untuk memanggil
(1) Dapatkan kaedah "Stand-in" (sebenarnya, ia adalah untuk membina objek Method dan biarkan objek Method ini menggantikan kaedah yang anda mahu gunakan sekarang)
(2) Kemudian berikan stand-in objek dan parameter yang diperlukan, dan biarkan stand-in memanggilnya untuk anda (seperti JOJO's A pengganti akan berjuang untuk anda)
Demonstrasi kod khusus adalah seperti berikut:
public class InvokeTest { public void test(String[] arg){ for (String string : arg) { System.out.println("zp is " + string); } } @Test public void invokeDemo() throws Exception { //获取字节码对象,这里要填好你对应对象的包的路径 Class<InvokeTest> clazz = (Class<InvokeTest>) Class.forName("com.example.zp.demo.testDemo.InvokeTest"); //形式一:获取一个对象 // Constructor con = clazz.getConstructor(); // InvokeTest m = (InvokeTest) con.newInstance(); //形式二:直接new对象,实际上不是框架的话,自己写代码直接指定某个对象创建并调用也可以 InvokeTest m = new InvokeTest(); String[] s = new String[]{"handsome","smart"}; //获取Method对象 Method method = clazz.getMethod("test", String[].class); //调用invoke方法来调用 method.invoke(m, (Object) s); }
Jadi menggunakan kaedah invoke memerlukan satu lebih banyak langkah daripada kaedah lain, iaitu membina objek Kaedah Objek ini menggantikan Program kini memanggil penggantian kaedah.
Selain parameter, invoke juga akan memerlukan objek tambahan, kerana kaedah panggilan memerlukan objek, jadi kaedah sasaran yang memanggil mahu memanggil memerlukan objek yang diperlukan bagi kaedah sasaran.
Nampaknya kaedah invoke bukan sahaja lebih menyusahkan daripada memanggil kaedah biasa secara terus, tetapi pernahkah anda memikirkannya, saya hanya perlu memasukkan parameter, dan saya boleh memanggil pelbagai kaedah alternatif, dalam situasi yang tidak diketahui , berdasarkan syarat yang mana objek dan kaedah untuk dipanggil secara tiba-tiba menjadikan kod fleksibel Ini bukan sahaja keindahan invoke, tetapi juga keindahan refleksi secara keseluruhannya. Ia boleh digunakan secara fleksibel mengikut keadaan semasa program dijalankan.
Atas ialah kandungan terperinci Bagaimana untuk menggunakan kaedah invoke di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!