2013-07-30 22 views
19

uzanan bir sınıftan bir yöntem almak için .getDeclaredMethod kullanın. Yani bir sınıf Method m = plugin.getClass().getDeclaredMethod("getFile"); kullanarak bir yöntem almaya çalışıyorum diyelim.Başka bir

Ancak bu plugin sınıfı, getFile yöntemine sahip olan başka bir sınıfı genişletiyor. Bunun, NoSuchMethodException istisnasını atmasına neden olup olmayacağından emin değilim.

Sınıfın, plugin uzantısının genişletildiğini biliyorum, getFile yöntemine sahiptir. Maalesef kafam karıştığında biraz yorgunum.

cevap

55

getDeclaredMethod yerine getMethod kullanmanız gerektiği gibi geliyor.

bu Sınıfı nesnesi tarafından temsil edilen sınıf veya arabiriminin belirtilen beyan yöntemini yansıtan bir yöntem nesnesi döndürür: getDeclaredMethod bütün mesele sadece üzerinde diyoruz sınıfta bildirilen yöntemler bulur olmasıdır . getMethod Oysa

var

Cı herhangi bir uygun yöntem aranır. uygun yöntem bulunursa, aşama 1 algoritması sadece olsa halka yöntemler bulacaksınız C

ait üst sınıf üzerinde ardışık çağrılır. Eğer peşinde olduğunuz yöntem kamu değilse, hiyerarşideki her sınıf üzerinde getDeclaredMethod veya getDeclaredMethods kullanarak, sınıf hiyerarşiyiye kendini recurse olmalıdır:

Class<?> clazz = plugin.getClass(); 
while (clazz != null) { 
    Method[] methods = clazz.getDeclaredMethods(); 
    for (Method method : methods) { 
     // Test any other things about it beyond the name... 
     if (method.getName().equals("getFile") && ...) { 
      return method; 
     } 
    } 
    clazz = clazz.getSuperclass(); 
} 
+0

+1, ben daha iyi bir çözüm. – rgettman

+0

Eğer yardımcı oluyorsa, kullanmamın nedeni öncelikle yöntemin özel olmasından kaynaklanmaktadır. Annd sonra düzenlersin. Tamam, düzenlemeyi deneyeceğim. – PaulBGD

+0

@Ultimate: Evet, bu oldukça önemli. Başlamak için bundan bahsetmiş olsaydın yardımcı olurdu. –