/ 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
Fil -> klasse
Fra : Jens Christian Gram


Dato : 28-11-01 14:44

Hej NG
Jeg håber der er nogen som kan hjælpe mig med mit problem, da jeg ikke
selv kan klare det.
Problemet består i at jeg i mit program gerne vil lade brugeren tilføje
klasser. Det vil sige at brugeren skal gå ind og vælge filen, hvorefter
mit program loader klassen, og gør noget ved den (jeg ved at klassen
overholder et bestemt interface).
Hvordan kan det laves? (kan det laves?)
--
Med venlig hilsen
Jens Christian Gram
jussi@mailme.dk

 
 
Martin Mouritzen (28-11-2001)
Kommentar
Fra : Martin Mouritzen


Dato : 28-11-01 13:55

On Wed, 28 Nov 2001 14:43:33 +0100, "Jens Christian Gram"
<jussi@mailme.dk> wrote:

>Problemet består i at jeg i mit program gerne vil lade brugeren tilføje
>klasser. Det vil sige at brugeren skal gå ind og vælge filen, hvorefter
>mit program loader klassen, og gør noget ved den (jeg ved at klassen
>overholder et bestemt interface).
>Hvordan kan det laves? (kan det laves?)

Du kan bruge reflection (Kig på java.lang.reflect).

Hmmm, kræver nok også lige et eksempel. (Prøv evt. også at søg på
<URL:http://java.sun.com>).

Eksemplet er et stykke tilrettet kode fra en af mine egne
applikationer, jeg håber jeg har fået det tilrettet så der ikke er
noget specifikt snask for min egen applikation. - Sig til hvis du har
spørgsmål.



/* Her kan du definere hvilken klasse du vil lave en instans af. - Du
kan evt. ved programstart køre en folder igennem eller lignende. */

myClass = Class.forName("package.for.your.class");

/* Hvilke parametre tager klassen? - I dette eksempel, en Vector og en
int. */
Class parameterTypes[] = new Class[2];
parameterTypes[0] = Vector.class;
parameterTypes[1] = int.class;
try {
   Constructor ct = myClass.getConstructor(parameterTypes);
   Object parameterList[] = new Object[2];
   parameterList[0] = new Vector();
   parameterList[1] = new Integer(80);
   try {
      DitInterface myPlugin =
(DitInterface)ct.newInstance(parameterList);
      // Nu kan du så bruge myPlugin.
   }
   catch (InstantiationException IE) {
      System.out.println("Could not Instantiate plugin: " +
myClass + ", possibly not correct constructor!");
   }
   catch (IllegalAccessException IAE) {
      System.out.println("The plugin: " + myClass + ", is
trying to access methods or fields it does not have rights for!");
   }
   catch (InvocationTargetException ITE) { // if the underlying
constructor throws an exception
      System.out.println("The plugin: " + myClass + ", threw
an Exception: " + ITE);
   }
}
catch (NoSuchMethodException NSME) {
   System.out.println("Could not Instantiate plugin: " + myClass
+ ", possibly not correct constructor!");
}
--
Guideix Martin Mouritzen Phone +45 43270524
Ringager 2A, 1. Java Developer Fax +45 43270556
DK-2605 Brøndby mm@guideix.com http://www.guideix.com

Martin Mouritzen (28-11-2001)
Kommentar
Fra : Martin Mouritzen


Dato : 28-11-01 14:00

On Wed, 28 Nov 2001 13:55:04 +0100, Martin Mouritzen <mm@guideix.com>
wrote:

>On Wed, 28 Nov 2001 14:43:33 +0100, "Jens Christian Gram"
><jussi@mailme.dk> wrote:

Iøvrigt lidt imponerende at mit svar kom før dit spørgsmål.
Jeg tror dit ur går en time foran.
--
Guideix Martin Mouritzen Phone +45 43270524
Ringager 2A, 1. Java Developer Fax +45 43270556
DK-2605 Brøndby mm@guideix.com http://www.guideix.com

Morten Primdahl (28-11-2001)
Kommentar
Fra : Morten Primdahl


Dato : 28-11-01 15:25

Jens Christian Gram wrote:

> Hej NG
> Jeg håber der er nogen som kan hjælpe mig med mit problem, da jeg ikke
> selv kan klare det.
> Problemet består i at jeg i mit program gerne vil lade brugeren tilføje
> klasser. Det vil sige at brugeren skal gå ind og vælge filen, hvorefter
> mit program loader klassen, og gør noget ved den (jeg ved at klassen
> overholder et bestemt interface).
> Hvordan kan det laves? (kan det laves?)
>

Den nemmeste måde er at bruge java.lang.Class.forName(String str);
Et hurtigt eksempel:

public interface Test {
public String doTest();
}

public class TestImpl implements Test {
public String doTest() {
return "doTest called";
}

public static void main(String[] args) throws Exception {
Class c = Class.forName("TestImpl");
Test t = (Test)c.newInstance();
System.out.println(t.getClass().getName()+": "+t.doTest());
}
}

Det skulle gerne udskrive "TestImpl: doTest called"

Mvh Morten

--
Morten Primdahl Caput A/S Tel +45 70 12 24 42
morten@caput.com Nygade 6 Fax +45 70 11 24 42
http://www.caput.com/ DK-1164 Kbh K


Christian Holm (28-11-2001)
Kommentar
Fra : Christian Holm


Dato : 28-11-01 16:08

"Morten Primdahl" <morten@caput.com> wrote in message
news:3C04F3AC.4080909@caput.com...
> Den nemmeste måde er at bruge java.lang.Class.forName(String str);

Dette vil også virke fint hvis filen, som brugeren har valgt, faktisk er i
din classpath. Hvis dette ikke er tilfældet må du skrive din egen
classloader. Dette er dog i JDK 1.3 blevet en smal sag

Christian



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste