Avatar billede luctatic Nybegynder
03. marts 2003 - 13:15 Der er 4 kommentarer og
1 løsning

SystemRessource()

Tidligere havde jeg et spørgsmål om hvordan man kan finde ud af hvor den klasse man benytter sig af ligger henne af. Dette gøre ved blandt andet at finde navnet på classen og så bruge this.getClass().getClassLoader().getSystemResource(sb.toString()).getPath(). Den del af det hele virker ganske glimrende.

Men når en anden klasse, der ligger i en anden pakke prøver at benytte sig af den, går det galt. Eksempel:

klasse1 ligger i /test/pakke1/klasse1 og i dens konstruktør bliver der oprettet en string hvor den henter dens egen sti via overnstående linie.

klasse2 ligger i /test/pakke2/klasse2 og opretter en instans af klasse1.

Men i klasse2 kommer der en nullPointerException, og vi har fundet frem til hvor den kommer.
this.getClass().getClassLoader().getSystemResource(sb.toString()) returnerer simpelthen null, da den ikke kan finde ressourcen, hvilket vi gætter er fordi den ligger i en anden pakke. Men burde klasse1 ikke selv udføre opslaget af stien når den bliver instantieret, eller bliver vi nød til at lave den til en tråd for at få det til at virke?
Avatar billede codemon Nybegynder
03. marts 2003 - 13:22 #1
Det ser ud til at I prøver at finde en Ressource med samme navn - sb.toString() - hvad det så er for et objekt.

Samme Ressource navn optræder sikkert ikke i forskellige klasser.
Avatar billede arne_v Ekspert
03. marts 2003 - 13:22 #2
Hvis det ikke er noget så banalt, at du skal bruge:
  Class.forName("pakkenavn.klassenavn")
i stedetfor:
  this.getClass()
så tror jeg at et lille eksempel vil gøre det nemmere at forstå hvad
det er du gør og foreslå en løsning.
Avatar billede luctatic Nybegynder
03. marts 2003 - 13:28 #3
Har grumlet lidt over det, og det lader til at hvis man benytter getResource() istedet for getSystemResource() så virker det. Umiddelbart kan jeg bare ikke se forskellen på de to.
Avatar billede arne_v Ekspert
03. marts 2003 - 13:34 #4
Jeg prøvede lige med følgende lille eksempel:

import java.util.*;

public class NewGetPath {
    private static String getPath(Class c) {
        String cn = c.getName();
        StringTokenizer st = new StringTokenizer(cn,".");
        StringBuffer sb = new StringBuffer("");
        boolean first = true;
        while(st.hasMoreTokens()) {
            if(first) {
                first = false;
            } else {
                sb.append("/");
            }
            sb.append(st.nextToken());
        }
        sb.append(".class");
        String path = NewGetPath.class.getClass().getClassLoader().getSystemResource(sb.toString()).getPath();
        int ix = path.length() - 1;
        while(path.charAt(ix) != '/' && path.charAt(ix) != '\\') ix--;
        return path.substring(0, ix + 1);
    }
    public static void main(String[] args) {
        System.out.println(NewGetPath.getPath(NewGetPath.class));
        System.out.println(NewGetPath.getPath(java.util.HashMap.class));
    }
}

og det returnerede korrekt:

/C:/eclipse/workspace/Eksperten/bin/
file:/C:/jdk1.3.1/jre/lib/rt.jar!/java/util/
Avatar billede luctatic Nybegynder
03. marts 2003 - 13:45 #5
Jeps arne, er også den jeg har brugt. Men getSystemResource(sb.toString) returnerer null, mens getResource(sb.toString) returnerer den rigtige URL. Lader til at getSystemResource() kun kigger i en bestemt mappe mens getResource er mere fri til at finde dem.


    private String getSti()
    {
        String cn = this.getClass().getName();
        StringTokenizer st = new StringTokenizer(cn,".");
        StringBuffer sb = new StringBuffer("");
        boolean first = true;
       
        while(st.hasMoreTokens())
        {
            if(first)
                first = false;
            else
                sb.append("/");
            sb.append(st.nextToken());
        }//end while
       
        sb.append(".class");
        return this.getClass().getClassLoader().getSystemResource(sb.toString()).getPath();
    }//end getPath
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