Jika saya memiliki dua variabel:
Object obj;
String methodName = "getName";
Tanpa mengetahui kelasnya obj
, bagaimana saya bisa memanggil metode yang diidentifikasi methodName
olehnya?
Metode yang dipanggil tidak memiliki parameter, dan String
nilai balik. Ini pengambil untuk kacang Jawa .
java
reflection
invoke
brasskazoo
sumber
sumber
Jawaban:
Mengodekan dari pinggul, itu akan menjadi seperti:
Parameter mengidentifikasi metode yang sangat spesifik yang Anda butuhkan (jika ada beberapa kelebihan beban tersedia, jika metode tidak memiliki argumen, hanya berikan
methodName
).Kemudian Anda memanggil metode itu dengan menelepon
Sekali lagi, tinggalkan argumen
.invoke
, jika Anda tidak punya. Tapi ya. Baca tentang Java Reflectionsumber
method
dimethod.invoke(obj, arg1, arg2,...);
. amethod = null;
memecahkan masalah tetapi menyebutkannya dalam jawaban bukanlah ide yang buruk.invoke
akan mengembalikan apa pun yang dikembalikan. Jika pengecualian terjadi menjalankan metode, pengecualian akan dibungkus denganInvocationTargetException
.Gunakan doa metode dari refleksi:
Dimana:
"class name"
adalah nama kelasobjectToInvokeOn
bertipe Object dan merupakan objek yang ingin Anda panggil metode ini"method name"
adalah nama metode yang ingin Anda panggilparameterTypes
adalah tipeClass[]
dan menyatakan parameter yang digunakan metodeparams
adalah tipeObject[]
dan mendeklarasikan parameter untuk diteruskan ke metodesumber
Bagi mereka yang menginginkan contoh kode langsung di Java 7:
Dog
kelas:ReflectionDemo
kelas:Keluaran:
Mishka is 3 year(s) old.
Anda dapat memanggil konstruktor dengan parameter dengan cara ini:
Atau, Anda dapat menghapus
dan lakukan
Bacaan yang disarankan: Membuat Instance Kelas Baru
sumber
Method
objek?Metode ini dapat dipanggil seperti ini. Ada juga lebih banyak kemungkinan (periksa api refleksi), tetapi ini adalah yang paling sederhana:
sumber
Pertama, jangan. Hindari kode semacam ini. Kode ini cenderung sangat buruk dan tidak aman juga (lihat bagian 6 dari Panduan Pengkodean Aman untuk Bahasa Pemrograman Java, versi 2.0 ).
Jika Anda harus melakukannya, lebih suka java.beans daripada refleksi. Kacang membungkus refleksi memungkinkan akses yang relatif aman dan konvensional.sumber
Untuk melengkapi jawaban kolega saya, Anda mungkin ingin memperhatikan:
Berikut ini adalah kode java1.4 lama yang memperhitungkan poin-poin tersebut:
sumber
sumber
sumber
Jika Anda melakukan panggilan beberapa kali, Anda dapat menggunakan metode baru menangani diperkenalkan di Java 7. Di sini kita pergi untuk metode Anda mengembalikan sebuah String:
sumber
invokeExact
kapan pun Anda bisa. Untuk itu, tanda tangan situs panggilan harus sama persis dengan tipe pegangan metode. Biasanya perlu sedikit waktu untuk mulai bekerja. Dalam hal ini Anda harus memberikan parameter pertama dengan:methodHandle = methodHandle.asType(methodHandle.type().changeParameterType(0, Object.class));
dan kemudian memanggil sepertiString result = (String) methodHandle.invokeExact(obj);
Ini terdengar seperti sesuatu yang bisa dilakukan dengan paket Java Reflection.
http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html
Khususnya di bawah Metode Meminta berdasarkan Nama:
import java.lang.reflect. *;
sumber
Pengindeksan (lebih cepat)
Anda dapat menggunakan
FunctionalInterface
untuk menyimpan metode dalam wadah untuk mengindeksnya. Anda bisa menggunakan wadah array untuk memanggil mereka dengan angka atau hashmap untuk memanggil mereka dengan string. Dengan trik ini, Anda dapat mengindeks metode Anda untuk memanggil mereka secara dinamis lebih cepat .Sintaks Lambda
Anda juga dapat menggunakan sintaks lambda:
sumber
O(1)
.SomeClass
adalah kelas dansomeVariable
merupakan variabel.sumber
Saya melakukan ini seperti ini:
sumber
Silakan merujuk kode berikut ini dapat membantu Anda.
Terima kasih....
sumber
Berikut adalah METODE SIAP MENGGUNAKAN:
Untuk memanggil metode, tanpa Argumen:
Untuk memanggil metode, dengan Argumen:
Gunakan metode di atas seperti di bawah ini:
Keluaran:
sumber
Student.java
StudentTest.java
sumber
Anda harus menggunakan refleksi - init objek kelas, lalu metode di kelas ini, dan kemudian memanggil metode ini pada objek dengan parameter opsional . Ingatlah untuk membungkus potongan berikut dalam blok coba-tangkap
Semoga ini bisa membantu!
sumber
Ini berfungsi dengan baik untuk saya:
}
Keluaran:
My input testparam
Saya dapat memanggil metode dengan memberikan namanya ke metode lain (seperti main).
sumber
menggunakan
import java.lang.reflect.*;
dan inilah cara Anda menggunakannya:
sumber
Dengan jooR itu hanyalah:
Berikut ini adalah contoh yang lebih rumit:
Ini mencetak:
sumber
bagi saya cara pembuktian yang cukup sederhana dan bodoh adalah dengan membuat metode metode pemanggil seperti:
maka ketika Anda perlu memanggil metode cukup taruh sesuatu seperti ini
sumber
className.getName().toString()
? Anda melewatkan seluruh titik refleksi.