/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
ClassLoader klasse ideer/info
Fra : Kim Lethan


Dato : 06-05-02 14:50



 
 
Dennis Thrysøe (06-05-2002)
Kommentar
Fra : Dennis Thrysøe


Dato : 06-05-02 15:03

Når I har loadet en klasse dynamisk skal I benytte Reflection API'et til
at lave en instans før I kan kalde metoden a'la:

Class clazz = loader.loadClass(a);
MyInterface f = clazz.newInstance();
System.out.println(f.getMinT());

Måske er det I mangler bare Class.forName() som returnerer et Class
objekt der representerer den klasse hvis fuldt kvalificerede navn man
gav med som argument?

Hvis I virkeligt vil bruge jeres egen classloaded kan denne også
registreres under den aktuelle classloader, således at det bliver jeres
classloader der står for at loade *alle* klasser.


-dennis



Kim Lethan wrote:
> Kære gruppe
>
> Vi søger en klasse som i et system kan bruges til at loade andre klasser
> med, ved hjælp af et argument (string) tilsvarende navnet på den klasse
> man ønsker loaded. Samtidigt skal metoderne i den loadede klasse
> overholde de interfaces vi har oprettet og være tilgængelige for systemet.
>
> Vi har eksperimenteret med kode fra nettet, men uden held. Vi har blot
> kunne loade klasser uden at være i stand til at addressere metoderne i
> dem. Se koden...
>
> //Uddrag af Main programmet - Compileren fejler ved linie 3 -
> f.getMinT() kan ikke findes i Class. Vi har prøvet at skrive vores
> Interface navn i stedet for Class men det fejer også.
>
> Simple1_2ClassLoader loader = new Simple1_2ClassLoader();
> Class f = loader.loadClass(a);
> System.out.println(f.getMinT());
>
> //Simple1_2ClassLoader.java er hentet fra:
>
> http://www.javaworld.com/jw-03-2000/classload/Simple1_2ClassLoader.java
>
>
> PF. tak
>
>


Kim Lethan (06-05-2002)
Kommentar
Fra : Kim Lethan


Dato : 06-05-02 15:38



Jan Oksfeldt Jonasen (06-05-2002)
Kommentar
Fra : Jan Oksfeldt Jonasen


Dato : 06-05-02 19:10

Kim Lethan <di010382@diku.dk> wrote:

> Vi har eksperimenteret lidt med forName(), og umiddelbart lyder det som om
> det er denne metode vi har prøvet at skabe selv... Vi kan dog ikke få den
> til at virke alligevel... Kan du give et eksempel på en anvendelse af
> denne metode?
>
Et simpelt eksemple kunne være med en List som instantieres dynamisk
ala:

public class SimpleLoad
{
public static void main(String [] args)
{
java.util.List liste = null;
try
{
Class cl = Class.forName("java.util.ArrayList");
liste = (java.util.List)cl.newInstance();

}
catch (Exception e)
{}
//Hvis der ingen exception kom er liste nu en klar til brug
//liste.
}
}

Der skal bruges et fuldgyldigt klassenavn på det vi dynamisk vil
oprette, i dette tilfælde er vores interface java.util.List, mens det vi
opretter er en java.util.ArrayList. At gribe Exception betragtes ikke
som god praksis, men for eksemplets skyld gøres det. De forskellige
Exceptions der kan opstå giver et godt prej om, hvad problemet måtte
være. F.eks. kan linie 9 give ClassCastException, hvilket her vil
indikere at vores instantierede klasse ikke implementere det ønskede
interface.

--
Mvh/re Jan Jonasen
jonasen (at) it (dot) dk

If I wanted culture, I'd eat yogurt. Ikke kun Tuborg har noget i gære.

Kim Lethan (06-05-2002)
Kommentar
Fra : Kim Lethan


Dato : 06-05-02 20:23

"Jan Oksfeldt Jonasen" <jonasenREMOVE@THISit.dk> skrev i en meddelelse
news:<1fbs22m.10410kggaq1foN%jonasenREMOVE@THISit.dk>...
> Et simpelt eksemple kunne være med en List som instantieres dynamisk
> ala:
>
> public class SimpleLoad
> {
> public static void main(String [] args)
> {
> java.util.List liste = null;
> try
> {
> Class cl = Class.forName("java.util.ArrayList");
> liste = (java.util.List)cl.newInstance();
>
> }
> catch (Exception e)
> {}
> //Hvis der ingen exception kom er liste nu en klar til brug
> //liste.
> }
> }

Mange tak for eksemplet, vi har nu fået det til at virke efter hensigten.

Med venlig hilsen

Kim Lethan



Thorbjørn Ravn Ander~ (06-05-2002)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 06-05-02 16:06

Kim Lethan <di010382@diku.dk> writes:

> Class f = loader.loadClass(a);
> System.out.println(f.getMinT());

Den er jeg også faldet i. Problemet ligger i at javac (som det drejer
sig om på det tidspunkt) ikke aner at jeres "f" er en fancy dims der
har en getMinT methode. Den ved kun at den er af typen Class som ikke
har en getMinT.

Hvis I har et interface som alle jeres klasser overholder på dette
tidspunkt så erklær f til at være af denne type (altså interfacet),
hvorefter javac godt vil lege med.


--
Thorbjørn Ravn Andersen
http://homepage.mac.com/ravn

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste