Avatar billede stigc Nybegynder
29. maj 2004 - 21:25 Der er 21 kommentarer og
1 løsning

At bruge en klasse uden package declaration

Jeg har et projekt hvor alle klasser ligge i samme package. Jeg ønsker at bruge en klasse som ikke har nogen package declaration. Men javac kan ikke finde klassen. Hvad er galt?

Det ser ca. sådan her ud:

package myPackage
public Klasse1 {
void test()
{
Klasse2 x = new Klasse2();
}
}


public Klasse2 {

}
Avatar billede erikjacobsen Ekspert
29. maj 2004 - 21:27 #1
Hvad med at lægge den i en package? Det er li'som formålet med det hele...
Avatar billede stigc Nybegynder
29. maj 2004 - 21:30 #2
Det kan jeg ikke, da den indeholder JNI.
Avatar billede arne_v Ekspert
29. maj 2004 - 21:41 #3
Det er et problem at bruge en klasse uden pakke fra en klasse med
pakke.

Man kan sagtens bruge pakker med JNI.

Se f.eks. min artikel om JNI.
Avatar billede stigc Nybegynder
29. maj 2004 - 21:47 #4
Igennem JNI bruges en kompileret Windows c .dll som jeg ikke kan ændre. Hvis jeg ligger klassen i min egne package, så får jeg en exception ved første kald. Er det ikke noget med at c-kodens funktionsnavne skal ændres hvis jeg ligger den i en package?

Kan man bruge en klasse uden pakke, fra en klasse i en pakke?
Avatar billede arne_v Ekspert
29. maj 2004 - 21:50 #5
Det er rigtigt pakke navnet indgår i funktions navnet.

Ikke umiddelbart fordi compileren tror at den ligger i samme pakke. Men
det må kunne lade sig gøre at loade den dynamisk.
Avatar billede stigc Nybegynder
29. maj 2004 - 21:53 #6
Hmmm så sidder jeg jo lidt
Avatar billede stigc Nybegynder
29. maj 2004 - 21:57 #7
fast.

Jeg får java.lang.ClassNotFoundException når jeg prøver at loade den dynamisk.
Avatar billede arne_v Ekspert
29. maj 2004 - 21:57 #8
Ham/hende der besluttede at lave den klasse uden pakke traf et valg
med konsekvenser.

Men lav det da med dynamisk load.
Avatar billede arne_v Ekspert
29. maj 2004 - 21:59 #9
Må vi se et stykke kode ?
Avatar billede stigc Nybegynder
29. maj 2004 - 22:00 #10
try {
Object o = Class.forName("myClass").newInstance();
} catch (Exception e) {System.out.println (e);}
Avatar billede arne_v Ekspert
29. maj 2004 - 22:04 #11
Ligger myClass.class hvor den skal d.v.s. i roden og ikke nede i pakken ?
Avatar billede arne_v Ekspert
29. maj 2004 - 22:04 #12
Og et eksempel med fuld dynamisk kald:

import java.lang.reflect.*;

public class Dynno {
    public Dynno() {
    }
    public String dup(String s) {
        return (s + s);
    }
    public static void main(String[] args) throws Exception {
        Object o = Class.forName("Dynno").newInstance();
        Class declarg[] = new Class[1];
        declarg[0] = String.class;
        Method m = o.getClass().getMethod("dup", declarg);
        Object callarg[] = new Object[1];
        callarg[0] = "abc";
        String res = (String)m.invoke(o, callarg);
        System.out.println(res);
    }
}
Avatar billede stigc Nybegynder
29. maj 2004 - 22:06 #13
Ja den ligger i roden.
Avatar billede arne_v Ekspert
29. maj 2004 - 22:09 #14
Har du verificeret med en decompiler/disassmbler at den faktisk ikke har nogen
pakke ?
Avatar billede stigc Nybegynder
29. maj 2004 - 22:12 #15
Jeg kan sagtens bruge den fra en test klasse som ikke ligger i en pakke.
Avatar billede arne_v Ekspert
29. maj 2004 - 22:35 #16
Mystisk.

Det virker nemlig hos mig:

C:\e4\test>type ..\Dynno.java
public class Dynno {
        public Dynno() {
        }
        public String dup(String s) {
                return (s + s);
        }
}

C:\e4\test>type TestDynno.java
package test;

import java.lang.reflect.*;

public class TestDynno {
    public static void main(String[] args) throws Exception {
        Object o = Class.forName("Dynno").newInstance();
        Class declarg[] = new Class[1];
        declarg[0] = String.class;
        Method m = o.getClass().getMethod("dup", declarg);
        Object callarg[] = new Object[1];
        callarg[0] = "abc";
        String res = (String)m.invoke(o, callarg);
        System.out.println(res);
    }
}

C:\e4\test>java -classpath .. test.TestDynno
abcabc
Avatar billede stigc Nybegynder
29. maj 2004 - 22:49 #17
Det må du undskylde. Du har helt ret. Nyt problem:

Jeg kan godt ved en simpel klasse, men med min JNI klasse som bruger native keyword (måske derfor?) så kaster newInstanse en exception.

java.lang.IllegalAccessException
Avatar billede stigc Nybegynder
29. maj 2004 - 23:08 #18
Konstruktøren var private. Nu virker det. Læg et svar.
Avatar billede arne_v Ekspert
29. maj 2004 - 23:11 #19
svar
Avatar billede stigc Nybegynder
29. maj 2004 - 23:15 #20
Hvordan ligger jeg en boolean eller en int i callarg?
Avatar billede stigc Nybegynder
29. maj 2004 - 23:17 #21
Fandt ud af det.

callarg[0] =  new Integer(1);
callarg[1] = new Boolean(true);
Avatar billede arne_v Ekspert
29. maj 2004 - 23:17 #22
Jeg mener bare at du liger wrapper typerne:

new Integer(123)
new Boolean(true)

ind.
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