2010-06-16 18 views
21

Mam tablicy znaków, który zawiera nazwy metody w klasieJava funkcja dynamicznego wywoływania

yyyyyy W klasie xxxxxx Robię yyyyyy instancji (słownie obj). Teraz mogę zadzwonić pod numer obj.function_name(), z wyjątkiem tego, że chcę przeczytać function_name z tablicy String w pętli. czy to możliwe?

+1

można rozwinąć? Nie jest to takie jasne do zrozumienia. –

+3

Uważam, że termin, którego szukasz, jest "odbiciem". – Stephen

+0

i jestem również pewien, co miał na myśli, to jest: http://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-the-method-name -as-a-string – gumuruh

Odpowiedz

32

Możesz, używając reflection. Dokonuje się tego, wywołując Yyyy.class.getMethod("methodName").invoke(someArgs)

Będziesz musiał obsługiwać kilka wyjątków, a Twoja metoda musi być public. Zwróć uwagę, że konwencje kodowania java wolą od methodName do method_name.

Korzystanie z refleksji powinno jednak być ostatecznością. Powinieneś używać więcej technik zorientowanych obiektowo.

Jeśli ciągle potrzeba podobne cechy, być może można spojrzeć na jakiegoś dynamicznego języka działającego na platformie Java, jak groovy

22

Jest to możliwe za pomocą refleksji, chociaż prawdopodobnie powinieneś zakwestionować swój projekt, jeśli potrzebujesz tego rodzaju zachowania. Class.getMethod zajmuje String dla nazwy metody i zwraca Method przedmiot, który można następnie zadzwonić .invoke na celu wywołać metodę

Zamieszczono Javadoc powinno być pomocne:

Przykładowy kod (zakładając, że metody yyyyyy przyjmują jeden argument int, aby pokazać argument pa ssing):

yyyyyy obj = new yyyyyy(); 
String[] methodNames = {"foo", "bar", "baz"}; 
for(String methodName : methodNames) { 
    Method method = Class.forName("yyyyyy").getMethod(methodName, new Class[] {int.class}); 
    method.invoke(obj, 4); // 4 is the argument to pass to the method 
} 
+1

Dlaczego nie użyjesz 'obj.getClass()' zamiast 'Class.forName ("yyyyyy") '? – Marc

+0

linki są pomieszane, spróbuj zastąpić (przez% 28 i)% 29 –

+1

@Marc Właściwie preferuję 'yyyyyy.class' przez którąkolwiek z nich, ale jakakolwiek praca –

Powiązane problemy