Příjem Java metodu bez použití getDeclaredMethod

hlasů
2

Přál bych si, aby inicializaci pole java metody ve třídě dítěte, jako pole třídy jako tak

void callme() {System.out.println(hi!);}
Method[] actions = new Method[] {&callme,&callme};

a volat všechny metody v tomto poli na nadřazené třídy, jako je takto:

for (meth:actions) {meth.invoke();}

Nicméně v současné době nemohu najít způsob, jak implicitně inicializaci pole akce, nikoli prostřednictvím konstruktoru. Vkládá mi dává chybu vzhledem k neošetřené výjimce:

Method[] actions = new Method[] {
    this.getClass().getDeclaredMethod(count)
};

Jak již bylo řečeno, nemohu při inicializaci toto pole explicitně jako pole zachytit výjimky, a to v konstruktoru.

Jsem nováček na java odrazu, takže to je asi zřejmá otázka, ještě jsem nenašel odpověď, že na google, jakýkoliv pomoci chtěl bych být ocenil.

dík

PS

Jak je uvedeno níže Scott hádal, já „chtějí supertřídou volat konkrétní soubor metod definovaných v podtřídě“.

Položena 13/03/2009 v 13:50
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
2

Podívejte se na Apache Commons - Beanutils ! Je to jako obal kolem celé odrazu, který je velmi snadné použití. To zábaly volání metod, měnit atributy, vyhledávání ...

Chcete-li přinést dynamický Java, měli byste se podívat dynamických JVM jazyků, které mohou být použity jednoduché včetně .jar knihovny! On z nich je Groovy , který obsahuje syntaxi java a přinést hodně dynamické funkce (skriptování, rapid-prototyping, Meta-Object-Protocol, runtime metoda repacement dynamické proxy ...).

Odpovězeno 13/03/2009 v 13:57
zdroj uživatelem

hlasů
3

Jste si jisti, že úvaha je správná věc? Za normálních okolností rozhraní s několika anonymních tříd jeho provedení by bylo lepší styl.

Můžete napsat Inicializátor blok, aby bylo možné zachytit výjimky během inicializace.

Proč nepoužiješ getMethod ()?

Odpovězeno 13/03/2009 v 13:58
zdroj uživatelem

hlasů
-2

Vytvoření statické metody ve své třídě, která vrátí pole deklarovaných metod a dělat správné manipulaci s výjimkami.

private static Method[] declaredMethods(Class<T> clazz, String methodName) {
  Method[] result = new Method[1];
  try{
    result[0] = clazz.getDeclaredMethod(methodName);
  } catch (NoSuchMethodException nsme) {
    // respond to the error
  } catch (SecurityException se)  {
    // Respond to the error
  }

  return result;
}

Method[] actions = declaredMethods("count");
Odpovězeno 13/03/2009 v 13:58
zdroj uživatelem

hlasů
0

To by mělo fungovat tak dlouho, jak vaše metoda je skutečně prohlášen za v this.getClass (). Pokud to je dědičná, měli byste používat Class.getMethod () místo.

Avšak namísto použití ukazatele na funkce, v Javě by se dalo definovat rozhraní s metodou jednoho chcete volat, a nechat toto rozhraní má být prováděn cílového objektu.

Také zvažte použití ArrayList, nebo jiné kolekce tříd namísto polí.

Odpovězeno 13/03/2009 v 13:58
zdroj uživatelem

hlasů
3

[Poznámka: Níže uvedený kód nebyl sestaven, ale měla by získat představu napříč]

Měl bych echo - to, co se snažíte dosáhnout?

Pokud chcete, supertřídou volat specifickou sadu metod definovaných v podtřídě, můžete udělat několik věcí.

S odrazem , doporučoval bych používat anotace:

1) definovat anotace HeySuperclassCallMe (aby retenční určitě je RUNTIME)

2) anotovat metody pro volání s HeySuperclassCallMe

@HeySuperclassCallMe public void foo...

3) ve své rodičovské třídě něco podobného

for (Method m : getClass().getMethods())
  if (m.getAnnotation(HeySuperclassCallMe.class) != null)
     m.invoke(...)

To je hezký reflexní způsob, jak to udělat.

Pro non-odrazu (což by mělo být o něco rychlejší, ale více kódu):

1) definuje rozhraní, které reprezentuje volání

 public interface Call {
     void go();
 }

2) ve své nadřazené definovat

 private List<Call> calls
 protected void addCall(Call call)

3) v podtřídě použít addCall:

 addCall(new Call() {public void go() {foo();}} );

4) v rodičovské třídě

 for (Call call : calls)
    call.go();
Odpovězeno 13/03/2009 v 14:28
zdroj uživatelem

hlasů
0

Mohu vám říci vaše ampersandy, které uvažují v C. Nemáme opravdu používat ukazatele na funkce v Javě.

Obecně platí, že byste se používat java odraz za to. Jako jeden z dalších plakátů řečeno - budete vytvářet rozhraní a mají předměty, které implementovány toto rozhraní - a to buď přímo, které ji provádějí, nebo s adaptérem nebo anonymní třídy:

interface Callable { void callme(); }

Callable[] foo = new Callable[] {
  new Callable() { public void callme() {System.out.println("foo!");}},
  new Callable() { public void callme() {System.out.println("bar!");}}
};

for(Callable c: foo) {
  c.callme();
}
Odpovězeno 13/03/2009 v 14:32
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more