Yansıma kullanarak statik bir yöntem çağırma


199

mainStatik olan yöntemi çağırmak istiyorum . Tür nesnesini aldım Class, ancak bu sınıfın bir örneğini oluşturamıyorum ve aynı zamanda staticyöntemi çağıramıyorum main.

Yanıtlar:


291
// 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");

Yöntem getDeclaredMethod()yerine özel kullanım durumunda getMethod(). Ve setAccessible(true)yöntem nesnesini çağırın .


49

Method.invoke () Javadoc'undan:

Temel alınan yöntem statikse, belirtilen nesne bağımsız değişkeni yoksayılır. Boş olabilir.

Ne zaman sen olur

Sınıf klass = ...;
Yöntem m = klass.getDeclaredMethod (methodName, paramtypes);
m.invoke (null, args)

14
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
Neden getMethod'u tüm yöntemlerde döngü yapmak yerine doğru adla kullanmıyorsunuz?
mjaggard

11
Bazen getMethod (veya getDeclaredMethod) parametre türlerini ayrıntılı olarak incelemenizi gerektirdiğinden, yöntemi döngüye sokmak ve ada göre bulmak çok daha kolaydır. Sadece mikro verimlilik önemlidir - Java yineleme çok hızlıdır, bu yüzden yöntemi iç döngüde milyonlarca kez çağırmazsanız, yineleme yeterince hızlı olacaktır
Tony Eastwood

2
Ayrıca daha gerçek bir durumda, yansımayı birçok kez çağırmak için kullanacak olsanız bile, yöntemi yalnızca bir kez bulursunuz. Bulmak çok ekstra yük önemsiz.
RenniePet

4
Aşırı yüklenmiş yöntemlerle kötü bir zaman geçireceğim.
Ulysse Mizrahi

1
@UlysseMizrahi her şey neyle eşleştiğinize bağlıdır, ancak evet kütüphane kodu yazıyorsanız, sadece isme güvenmek tehlikeli olabilir. Ben genellikle "bir String alır ve sınıfın bir örneğini döndürür statik yöntem" gibi belirli bir açıklama veya belirli bir yöntem imzası için kontrol edin, sonra sadece böyle bir yöntem bulundu iddia.
cobbzilla

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

Yukarıdaki örnekte, 'add' iki tamsayıyı bağımsız değişken olarak alan statik bir yöntemdir.

Aşağıdaki snippet, giriş 1 ve 2 ile 'add' yöntemini çağırmak için kullanılır.

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

Referans bağlantısı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.