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?
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
27. januar 2005 - 16:37
#1
Prøv: div.Class1 c2=new div.Class1();
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.
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();
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?
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.
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()); } } }
28. januar 2005 - 17:23
#7
svar
Kurser inden for grundlæggende programmering