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.

Steven
sumber

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.

Adeel Ansari
sumber
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)
atk
sumber
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;
    }
}
Frostman
sumber
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 .

Hari Krishna
sumber