2012-02-19 12 views
6

Esiste un modo per utilizzare metodi magici in Java come in PHP con __call?Chiamare magicamente metodi in Java

Per esempio:

class foo { 
    @Setter @Getter 
    int id; 

    @Getter 
    Map <String, ClassInFoo> myMap; 

    protected class ClassInFoo { 
      @Setter @Getter 
      String name; 
    } 

    @Setter 
    String defaultKey; 
} 

che sto usando Project Lombok annotazioni per i metodi getter e setter per semplificare il codice.

Consideriamo che la mia mappa contiene diversi elementi mappati da String e defaultKey definisce quello predefinito.

Quello che vorrei è poter chiamare foo.getName() che restituirebbe il nome predefinito come foo.myMap.get(defaultKey).getName().

La ragione per cui non posso semplicemente scrivere tutti i getter manualmente è che la classe Foo è in realtà ereditata con generici e la classe interna potrebbe essere diversa.

ho sorta di bisogno di qualcosa come:

function Object __call(method) { 
      if (exist_method(this.method) 
       return this.method(); 
      else 
       return this.myMap.get(defaultKey).method(); 
    } 

È questo in qualche modo possibile in Java?

EDIT:

Ho fatto un esempio più precisa di quello che sto cercando di realizzare qui: https://gist.github.com/1864457

L'unica ragione per farlo è quello di "stenografia" i metodi nella classe interna.

+0

Fare l'upvoting come una domanda interessante, ma questo non dovrebbe essere etichettato OOP. La funzione che ti interessa non è orientata agli oggetti e infatti non è nemmeno necessariamente dinamica. – Perception

+1

Generalmente vuoi i tuoi getter e setter che puoi generare con il tuo IDE. Ad esempio, non è una buona idea avere un getter per restituire una collezione mutevole. invece puoi avere 'ClassInFoo getMyMap (Nome stringa)' –

+0

Sì, posso scrivere tutti i getter, ma l'ho trovato duplicato e brutto. Mi piacerebbe così che i miei ragazzi di codice HTML possano richiedere semplicemente questi metodi. –

risposta

5

È assolutamente possibile attraverso reflection utilizzando le sue caratteristiche come

public Method getMethod(String name, Class<?>... parameterTypes) 

che può essere utilizzato per vedere se una classe ha alcuni metodi definiti ma non vedo come il tuo problema non possa essere risolto con un uso corretto o interfacce f, eredità e prioritario dei metodi

caratteristiche come riflessione sono forniti per gestire certe, altrimenti irrisolvibili, problemi, ma Java non è PHP così si dovrebbe cercare di evitare di usarlo quando possibile, dato che non è nel filosofia di la lingua.

+0

La riflessione mi ha aiutato a risolvere il problema. Grazie! –

2

Non è forse l'intero punto dell'ereditarietà e del superamento?

Classe base:

public Object foo() { 
    return this.myMap.get(defaultKey).method(); 
} 

sottoclasse:

@Overrides 
public Object foo() { 
    return whateverIWant; 
} 
+0

Ho fatto un esempio più preciso qui: https://gist.github.com/1864457 - puoi spiegare la tua proposta più dettagliatamente? Grazie. –

+0

Se il metodo getName() nella classe di frutta è implementata come questo, funzionerà come previsto:. GetContents ritorno '() ottiene (getDefaultKey()) getName()'.. Stai capendo in che modo l'ereditarietà e il lavoro prioritario? Leggi http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html –