Avatar billede jespersahner Nybegynder
20. juni 2006 - 12:14 Der er 12 kommentarer og
1 løsning

Oprette objekt vha. reflection

At oprette objekter dynamisk vha. reflection kan gøres på flg. måde:

MinKlasse m=new MinKlasse(true);
Class cl=m.getClass();
Constructor con=cl.getConstructor(new Class[] {boolean.class});
MinKlasse m2=(MinKlasse)con.newInstance(new Object[]{true});

Her antages det, at MinKlasse har en konstruktør, der tager en boolean som argument, og der oprettes et nyt objekt m2 ud fra m.

Mit spm. er nu, om det samme kan lade sig gøre, hvis man ikke har objektet m men kun referencen, altså:

MinKlasse m;

I dette tilfælde kan m.getClass() ikke benyttes, idet m er null.

Kan dette lade sig gøre alligevel?
Avatar billede mikkelbm Nybegynder
20. juni 2006 - 12:19 #1
Class cls = MinKlasse.class;
Avatar billede jespersahner Nybegynder
20. juni 2006 - 12:34 #2
->mikkelbm: Jo, men så ryger dynamikken.

Hvis man nu mere generelt har en array af referencer a la:
MinKlasse1 m1;
MinKlasse2 m2;
MinKlasse3 m3;
MinKlasse[] m={m1,m2,m3};

- hvor MinKlasse1, MinKlasse2 og MinKlasse3 alle arver fra/implementerer MinKlasse, vil jeg gerne kunne spole igennem m og oprette objekter af de respektive klasser.
Avatar billede mikkelbm Nybegynder
20. juni 2006 - 12:40 #3
"Jo, men så ryger dynamikken."

Det synes jeg nu ikke:

MinKlasse[] m = new MinKlasse[3];

for (int i = 0; i < m.length; i++)
{
  Class cl = MinKlasse.class;
  Constructor con = cl.getConstructor(new Class[] {boolean.class});
  m[i] = (MinKlasse)con.newInstance(new Object[]{true});
}

Så har du et array med instanser af MinKlasse.
Avatar billede jespersahner Nybegynder
20. juni 2006 - 12:54 #4
->mikkelbm: Jo, men det skal jo ikke være objekter af MinKlasse men objekter af MinKlasse1, MinKlasse2 og MinKlasse3.
Avatar billede mikkelbm Nybegynder
20. juni 2006 - 13:13 #5
Men har du forskellige constructors på de forskellige klasser?
Avatar billede jespersahner Nybegynder
20. juni 2006 - 13:49 #6
->mikkelbm: Nej
Avatar billede mikkelbm Nybegynder
20. juni 2006 - 13:59 #7
Så måske noget a la:

MinKlasse1 m1;
MinKlasse2 m2;
MinKlasse3 m3;
MinKlasse[] m={m1,m2,m3};

for (int i = 0; i < m.length; i++)
{
  if (m[i] instanceof MinKlasse1)
  {
    Class cl = MinKlasse1.class;
    Constructor con = cl.getConstructor(new Class[] {boolean.class});
    m[i] = (MinKlasse1)con.newInstance(new Object[]{true});
  }
  else if (m[i] instanceof MinKlasse2)
    ; //...
  else if (m[i] instanceof MinKlasse3)
    ; //...
}

..

Hvor du for hver type opretter en instans. Men det synes jeg så ikke er dynamisk.
Avatar billede jespersahner Nybegynder
20. juni 2006 - 14:10 #8
->mikkelbm: Nej, det vil ikke kompilere, fordi m[i] ikke er initialiseret - og måske er det svaret på mit spm.: Det giver ikke mening at ville referere til "m", hvis ikke "m" er initialiseret. En fredelig workaround er dog at oprette:

Class[] classes={MinKlasse1.class, MinKlasse2.class, MinKlasse3.class};
- og så tage classes med i for-løkken, altså noget med:

MinKlasse1 m1;
MinKlasse2 m2;
MinKlasse3 m3;
MinKlasse[] m={m1,m2,m3};
Class[] classes={MinKlasse1.class, MinKlasse2.class, MinKlasse3.class};
for (int i = 0; i < m.length; i++)
{
  Class cl = classes[i];
  Constructor con = cl.getConstructor(new Class[] {boolean.class});
  m[i] = (MinKlasse)con.newInstance(new Object[]{true});
}
Avatar billede mikkelbm Nybegynder
20. juni 2006 - 14:22 #9
Ja, men absolut ikke dynamisk :)
Avatar billede jespersahner Nybegynder
20. juni 2006 - 14:36 #10
->mikkelbm: Jo, netop! Hele for-løkken er jo netop helt uafhængig af resten lige pånær referencen til MinKlasse, som de andre klasser arver fra.

Smid gerne et svar som tak for diskussionen.
Avatar billede mikkelbm Nybegynder
20. juni 2006 - 14:43 #11
MinKlasse[] m={m1,m2,m3};
Class[] classes={MinKlasse1.class, MinKlasse2.class, MinKlasse3.class};

Er i mine øjne ikke dynamisk, da det er nødvendigt med 2 arrays. Men hvis du har opnået det du vil, er det vel ligemeget :)
Avatar billede mikkelbm Nybegynder
20. juni 2006 - 14:43 #12
og et svar...
Avatar billede jespersahner Nybegynder
20. juni 2006 - 14:53 #13
->mikkelbm: For så vidt enig, men hvis ikke det kan lade sig gøre at undvære linien med Class[] classes=... er det nok den bedste løsning.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester