Avatar billede jespersahner Nybegynder
27. januar 2005 - 16:33 Der er 6 kommentarer og
1 løsning

Class.forName's virkemåde

Et sikkert simpelt spm. :-)

Jeg definerer to udgaver af samme klasse:

public class Class1 {
    public int i;
    public Class1() {
        i=1;
    }   
}

og i en anden pakke:

package div;

public class Class1 {
    public int i;
    public Class1() {
        i=2;
    }   
}

Herefter prøver jeg med:

import div.*;

public class Benyt_Class1 {
    public static void main(String[] args) throws Exception {
        Class.forName("Class1");
        Class1 c1=new Class1();
        System.out.println(c1.i);
        Class.forName("div.Class1");
        Class1 c2=new Class1();
        System.out.println(c2.i);
    }   
}

- og får flg. output:
1
1

Hvorfor får jeg ikke '2' som output efter load af div.Class1?
Avatar billede arne_v Ekspert
27. januar 2005 - 16:37 #1
Prøv:

div.Class1 c2=new div.Class1();
Avatar billede arne_v Ekspert
27. januar 2005 - 16:39 #2
div.Class1 "overskriver" ikke Class1 - de ligger der begge

og Java kan ikke gætte at

Class1 c2=new Class1();

er

div.Class1 c2=new div.Class1();

selvom div.Class1 var den sidste klasse du loadede.
Avatar billede arne_v Ekspert
27. januar 2005 - 16:41 #3
Hm

Iøvrigt tror jeg såmænd at din kode virker uden kald af Class.forName overhovedet,
da ægte dynamisk loading ser ud som:

EtInterface i = (EtInterface)Class.forName("EnKlasse").newInstance();
Avatar billede jespersahner Nybegynder
27. januar 2005 - 16:52 #4
->arne_v: Det prøver jeg lige..men ideen her er netop at "overskrive" Class1, så koden efterfølgende altid er den samme uanset hvilken udgave af Class1, der er load'et.

How do I do that?
Avatar billede arne_v Ekspert
27. januar 2005 - 16:58 #5
Som jeg beskrev du laver et interface eller en abstrakt klasse og så laver
du med Class forName newInstance et objekt af en ikke abstrakt klasse som
implementerer/extender interface/abstrakt klasse.
Avatar billede jespersahner Nybegynder
28. januar 2005 - 17:19 #6
->arne_v: Tror jeg forstår det nu, smid lige et svar.

Til min egen orientering:

public abstract class AClass1 {
    public int i;
    public abstract int metode();
}

public class Class1 extends AClass1 {
    public int metode() {
        return 1;
    }
}
public class Class2 extends AClass1 {
    public int metode() {
        return 2;
    }
}

public class Benyt_Class1 {
    public static void main(String[] args) throws Exception {
        String s;
        for (int i=0;i<10;i++) {
            if (Math.random()>0.5) {
                s="Class1";
            }
            else {
                s="Class2";
            }       
            AClass1 c1 = (AClass1)(Class.forName(s).newInstance());
            System.out.println(c1.metode());       
        }
    }   
}
Avatar billede arne_v Ekspert
28. januar 2005 - 17:23 #7
svar
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