25. februar 2004 - 12:02Der er
17 kommentarer og 3 løsninger
Lave metodekald udfra en tekststreng indeholdende metodens navn
Hejsa eksperter, jeg ville blot høre om det var muligt at lave et metodekald udfra en String indeholdende navnet på en metode i en klasse....
Lad os sige jeg har følgende klasse:
class Person { private String navn = "hej";
public String getNavn() { return navn; } }
Hvordan får jeg så kaldt metoden getNavn (forudsat jeg har en instans af objektet, naturligvis)... Har det ikke noget med reflection at gøre....
Det jeg søger efter er et "hands on" / konkret eksempel, samt nogle links om dette emne? Jeg ved bare ikke helt om jeg skal begi' mig i krig med dette emne, eller implementere mit ønskede system vha. en anden fremgangsmåde....
60 point (jow, det er dælme svært for mig) til den som giver et eksempel, samt nogle links...
I et inbound callcenter, hvor identiteten på den, der ringer ind, skal bekræftes, kan kontrollen nu foregå i telefonkøen. Det understøtter fem centrale KPI'er for callcentre.
Her er et eksempel der viser hvorfor det kan være vigigt at vide hvilken instans af klassen metoden bliver kaldt i:
class Person { private String navn; public Person( String navn ) { this.navn = navn ) //end constructor public String getNavn() { return navn; } //end method } //endclass Person
public class TestProg { public void main( String[] args ) { Person corholio = new Person( "Anders" ); // lav en instans af den klasse Person jakoba = new Person( "Jakob" ); // lav en instans af den klasse // de forskellige instanser af Person har forskellige værdier // i deres navn variabel
System.out.println( corholio.getNavn() ); System.out.println( jakoba.getNavn() ); // brug instansen til at udpege hvor metoden getNavn skal udføres } //end method main } //endclass TestProg
mvh JakobA
Synes godt om
Slettet bruger
25. februar 2004 - 13:29#3
det er fordi jeg vil ha' metodekaldet til at ske ud fra en parameter, altså noget i stil med:
public void kaldMetode(Object mitObjektAtKalde, String metodeNavn) { //kald metoden med navn "metodeNavn" i objektet mitObjektAtKalde... }
Det er forskelligt fra gang til gang hvilken metode som skal kaldes på objektet, og disse (mange) forskellige metodekald skal kunne kaldes fra een metode af
corholio >> men hvad har du så tænkt dig at stille op mht. argumenter til metoden ???
Hvis det er du vil lave en kaldMetode(etObj, enMetode), så burde den jo næsten udvides til kaldMetode( obj, metode, args );
og hvis du vil igang med dette, ja, så skal du igang med reflection...
Det er et stykke tid siden, jeg har arbejdet med det - men kan måske lave et lille eksempel...
BEMÆRK dog at reflection ikke er nogen god ide hvis det kan laves anderledes, ved at ændre arkitekturen lidt -- at skulle til at slå metoder op etc og al den exceptionhandling, som skal omkredse det gør at reflection kun er det værd i få tilfælde...
Synes godt om
Slettet bruger
25. februar 2004 - 13:47#5
Det kan da godt være at jeg skulle revurdere min arkitektur - nåååh....hvis du smider et eksempel på brug af reflection, bearhugx, får du pointene - jeg skal under alle omstændigheder lige prøve det af....
Det ville jeg gøre med en switch og en (lang) streng der indeholder alle gyldige navne:
Final String langKonstantStreng = " " + // forste led er et enkelt blanktegn "getNavn " + // hvert 'led' i strengen er 16 bogstaver langt "getAdresse " + "getSkoNummer " + // ... osv osv "getNogetAndet ";
public Sting gørNogetDerReturnererEnStreng( String metodeNavn ) { int metodeIndex = langKonstantStreng.indexOf( " " + metodenavn + " " ); if ( metodeIndex >= 0 ) metodeIndex /= 16; switch ( metodeIndex ) { case 0: return getNavn(); // vi returnerer så der er ikke brug for break; case 1: return getAdresse(); case 2: return getSkoNummer(); // ... osv, osv case N: return getNogetAndet(); default return "Det er noget galt her"; } } //endmethod gørNogetDerReturnererEnStreng
mvh JakobA
Synes godt om
Slettet bruger
25. februar 2004 - 13:50#7
det begyndte jeg også lige selv at tænke på.... *sigh* søvnmangel er sq' en forfærdelig ting :-| ....
Jeg venter lige og ser om bearhugx smider et eksempel, så får i lige en 30/70 fordeling af pointene
dette er ikke aftestet (jeg har ikke java på denne computer, så det er skrevet fra hukommelsen) ...
import java.lang.reflect.*;
class ReflectionTest { public String denneMetodeVilJegKaldeFordiDensNavnErIEnTekstStreng( String msg ) { System.out.println(" Hejsa fra den lange metode - her er beskeden : "+msg); return "ok"; }
public ReflectionTest() { String metodeNavn = "denneMetodeVilJegKaldeFordiDensNavnErIEnTekstStreng"; String msg = "hej corholio og jacoba";
ReflectionTest obj = this; Class enRTClass = this.getClass(); Class[] argumentTypeListe = new Class[] {String.class}; // En array med en String - da vi ønsker at ramme den variant, som kun tager en String som argument Object[] argumenter = new Object[] {msg};
Pointfordelingen blev så 6, 27, 27.... fordi JakobA fik min hjerne til at revurdere min arkitektur, og så arne_v og bearhugx dele resten, da de begge kom med eksempler med brug på reflection....
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.