Meminta metode statis menggunakan refleksi


198

Saya ingin memanggil mainmetode yang statis. Saya mendapatkan objek bertipe Class, tetapi saya tidak dapat membuat turunan dari kelas itu dan juga tidak dapat memanggil staticmetode main.

Jawaban:


290
// String.class here is the parameter type, that might not be the case with you
Method method = clazz.getMethod("methodName", String.class);
Object o = method.invoke(null, "whatever");

Dalam hal metode ini adalah penggunaan pribadi, getDeclaredMethod()bukan getMethod(). Dan panggil setAccessible(true)objek metode.


49

Dari Javadoc of Method.invoke ():

Jika metode yang mendasarinya statis, maka argumen obj yang ditentukan diabaikan. Mungkin nol.

Apa yang terjadi ketika kamu

Kelas klass = ...;
Metode m = klass.getDeclaredMethod (methodName, paramtypes);
m.invoke (null, args)

13
String methodName= "...";
String[] args = {};

Method[] methods = clazz.getMethods();
for (Method m : methods) {
    if (methodName.equals(m.getName())) {
        // for static methods we can use null as instance of class
        m.invoke(null, new Object[] {args});
        break;
    }
}

11
Mengapa tidak menggunakan getMethod dengan nama yang benar alih-alih mengulang semua metode?
mjaggard

11
Kadang-kadang jauh lebih mudah untuk mengulang dan menemukan metode berdasarkan nama daripada menggunakan getMethod karena getMethod (atau getDeclaredMethod) mengharuskan Anda mengerjakan tipe parameter dengan sangat detail. Itu hanya tergantung jika masalah efisiensi mikro - iterasi Java sangat cepat jadi kecuali jika Anda memanggil metode jutaan kali dalam beberapa loop batin maka iterasi akan cukup cepat
Tony Eastwood

2
Juga dalam situasi yang lebih nyata, Anda mungkin hanya akan menemukan metode itu sekali saja, bahkan jika Anda akan menggunakan refleksi untuk memintanya beberapa kali. Jadi overhead tambahan ketika menemukan itu tidak penting.
RenniePet

4
Akan memiliki waktu yang buruk dengan metode kelebihan beban.
Ulysse Mizrahi

1
@UlysseMizrahi semuanya tergantung pada apa yang Anda cocokkan, tapi ya jika Anda sedang menulis kode perpustakaan, bisa berbahaya jika hanya mengandalkan nama. Saya biasanya memeriksa anotasi tertentu, atau tanda tangan metode tertentu, seperti "metode statis yang mengambil String dan mengembalikan turunan kelas", lalu menyatakan bahwa hanya ada satu metode yang ditemukan.
cobbzilla

0
public class Add {
    static int add(int a, int b){
        return (a+b);
    }
}

Dalam contoh di atas, 'add' adalah metode statis yang menggunakan dua bilangan bulat sebagai argumen.

Cuplikan berikut digunakan untuk memanggil metode 'tambah' dengan input 1 dan 2.

Class myClass = Class.forName("Add");
Method method = myClass.getDeclaredMethod("add", int.class, int.class);
Object result = method.invoke(null, 1, 2);

Tautan referensi .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.