Avatar billede bearhugx Nybegynder
07. januar 2003 - 13:47 Der er 33 kommentarer og
1 løsning

Kan man få systemets fulde sti for en given klasse-ressource

Hejsa ... Jeg har en applet, som bruger en ekstern package...

Nu er det sådan, at jeg har lagt mærke til at appletten kører - også selvom jeg fjerner .jar-filen som den eksterne package ligger i fra den sti, som jeg tidernes morgen opgav som projektets classpath. Packagen ligger hellerikke i systemets classpath..

Hvordan kan det lige gå til...


Såh, nu har jeg besluttet mig, at teste det...

Er der nogen måde, hvormed jeg kan få fat i, hvor i filsystemet, den finder objekter denne eksterne package...

Altså kan jeg i en en klasse få udskrevet, URL'en for en given klasse X - f.eks. på formen "Klasse X bliv fundet i filen C:\subdir\misc.jar

/Søren
Avatar billede soreno Praktikant
07. januar 2003 - 13:52 #1
Hvis jeg skulle finde udaf hvor filen blev hentet fra ville jeg bruge Filemon fra:
http://www.systernals.com/ntw2k/source/filemon.shtml

Det er et program der overvåger al disk aktivitet - på den måde kan du finde frem til hvor misc.jar filen findes.

Eller køre en:
c:\dir misc.jar /a /s /p
Avatar billede bearhugx Nybegynder
07. januar 2003 - 13:58 #2
Jeg ved godt hvor misc.jar ligger på systemet ..
Det, der undrer mig, det er, hvordan appletten kan finde ud af at få fat i denne package, selvom der ikke burde ligge nogle informationer om, hvor denne jar-fil er henne ... Den er endda flyttet fra det sted, hvor den lå, da appletten blev kompileret...

Så - hvordan kan jeg (når jeg kører appletten) få udskrevet, hvor den har fundet denne klasse X henne (for den ligger ikke i nogen path)
Avatar billede arne_v Ekspert
07. januar 2003 - 16:29 #3
Har du provet at cleare browserens cache ?
Avatar billede bearhugx Nybegynder
07. januar 2003 - 18:06 #4
Hvordan clearer jeg cachen ...  Bare slet TempInternetFiles eller ???
Avatar billede soreno Praktikant
07. januar 2003 - 18:19 #5
Du kan evt. lave en "forced reload" med (ctrl|alt)+f5 (kan ikke huske hvilken, men det plejer at virke med de fleste Windows baserede browsere).

Men, ja - slet "Temp Inet files" :-)
Avatar billede arne_v Ekspert
07. januar 2003 - 18:23 #6
"Tools" "Internet Options" "Delete Files" i IE 5
Avatar billede bearhugx Nybegynder
07. januar 2003 - 18:49 #7
Done - men den kører stadigvæk glimrende !
(*typisk mig -- undrer mig febrilsk fordi noget virker! *LOL*)
Avatar billede arne_v Ekspert
07. januar 2003 - 19:31 #8
Avatar billede bearhugx Nybegynder
13. januar 2003 - 19:47 #9
Jeg har ikke fået svar på spm'et  - heller ikke hos de andre java-guru'er jeg kender -- Jeg vælger at lukke spm'et  og tildeler points til arne_v, da han pegede videre i en retning...
Avatar billede arne_v Ekspert
13. januar 2003 - 19:50 #10
Det sidste link må da være ret nem at anvende.

Du har misc.jar - der vælger du en class X og så lader du
din applet bruge metoden i linket på klasse X !

2 minutter og så skulle den være hjemme.  :-)
Avatar billede bearhugx Nybegynder
13. januar 2003 - 19:55 #11
Tjoo.. Men den løsning, du kommer frem til ( String getPath() ) - så vidt jeg læser den, så skal jeg ind i den eksterne package og implementere gerPath-metoden på min klasse X ????

Jeg har ikke sourcen til den omtalte eksterne package (er en jar-fil, som jeg ikke har noget med at gøre)

Kan jeg da stadigvæk bruge løsningen fra det andet spm ?
Avatar billede bearhugx Nybegynder
13. januar 2003 - 19:57 #12
(det er måske mig, som ikke kan se det - men...)
Avatar billede arne_v Ekspert
13. januar 2003 - 20:39 #13
Prøv og erstate:

    private String getPath(){
        String cn=this.getClass().getName();
        java.util.StringTokenizer st=new java.util.StringTokenizer(cn,".");
        StringBuffer sb = new StringBuffer("");
        boolean first = true;
        while(st.hasMoreTokens()){
            if(first)first=false;
            String curr=st.nextToken();
            if(curr!=""){
                if(!first)
                    sb.append("\\");
                sb.append(curr);
            }
        }
        sb.append(".class");
        String path=sb.toString();
        return this.getClass().getClassLoader().getSystemResource(path).getPath();
    }

med:

    private static String getPath(String cn){
        java.util.StringTokenizer st=new java.util.StringTokenizer(cn,".");
        StringBuffer sb = new StringBuffer("");
        boolean first = true;
        while(st.hasMoreTokens()){
            if(first)first=false;
            String curr=st.nextToken();
            if(curr!=""){
                if(!first)
                    sb.append("\\");
                sb.append(curr);
            }
        }
        sb.append(".class");
        String path=sb.toString();
        return this.getClass().getClassLoader().getSystemResource(path).getPath();
    }
Avatar billede bearhugx Nybegynder
13. januar 2003 - 20:51 #14
Hej Arne ... Ved nærlæsning fik jeg omformet min kode, til også at indeholde _noget_ af dit forrige svar -- Omend jeg ikke har fået udskrevet path osv. endnu, så var der en ting, der slog mig...

Selvom jeg importer
netscape.javascript.*;
for at få fat i netscape.javascript.JSObject;

så, når jeg udskriver stringbufferen (SB), så får jeg outputtet "SB = sun/plugin/javascript/ocx/JSObject.class"

Dvs. at det går ind og bruger en af suns egne klasser i stedet for (sikkert fordi den ikke kan finde netscape-jar'en nogen steder :-)

At jeg ikke kan få skrevet path ud, skyldes måske at det er en applet ???? Ved ikke om SercurityManageren går ind og brokker sig (får dog ingen exceptions)

Spørgsmålet er så bare - hvor ligger sun.plugins.javascript.ocx.JSObject så henne :-)

(har nemlig afprøvet koden på en anden maskine som kun havde Applet-plugin installeret -- og der kørte det ikke en meter :-/ )
Avatar billede arne_v Ekspert
13. januar 2003 - 21:02 #15
Øh.

class name -> string buffer er en ren tekst erstatning !

Der er no way at netscape.javascript.JSObject kan blive til
un/plugin/javascript/ocx/JSObject.class !!

Kan du ikke lige vise din kode ?

Jeg har aldrig arbejdet med applets, så jeg er ikke skrap
til det applet specifikke.
Avatar billede bearhugx Nybegynder
13. januar 2003 - 21:06 #16
import java.applet.*;
import java.util.*;

import netscape.javascript.*;

/**
* @author Søren Munk Skrøder
*/
public class AlertApplet extends Applet {
    private JSObject win;

    public void init() {
        try{
            win = JSObject.getWindow(this);

            Timer t = new Timer();
            t.schedule(new JSTask(), 0, 100);

            // Find navn på leverandør af "JSObject"           
            String cn = win.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());
      }
      sb.append(".class");
      System.out.println("SB = "+sb.toString());
     
      System.out.println("før Classloader-opslag : \n String path = this.getClass().getClassLoader().getSystemResource(sb.toString()).getPath();");
     
     
      // åbenbart kommer koden aldrig forbi her --- "Path = ..." bliver aldrig udskrevet
      String path = this.getClass().getClassLoader().getSystemResource(sb.toString()).getPath();
      System.out.println("Path = "+path);
        } catch(Exception ex) {
            getAppletContext().showStatus(ex.toString());
        }       
    }

    private class JSTask extends TimerTask {
        private Date data = new Date();
        public void run() {
            String status = (String) win.getMember("status");
            if(status.equals("running"))
                data = new Date();
            win.eval("data='"+data.toString()+"'");
            win.eval("updateData()");
        }
    }
}

---------------OUTPUT-----------------
SB = sun/plugin/javascript/ocx/JSObject.class

før Classloader-opslag :
String path = this.getClass().getClassLoader().getSystemResource(sb.toString()).getPath();
Avatar billede bearhugx Nybegynder
13. januar 2003 - 21:07 #17
Selve funktionaliteten på hjemmesiden er et ur, som bliver opdateret hvert sekund
Avatar billede arne_v Ekspert
13. januar 2003 - 21:07 #18
Prøv og erstat:
  String cn = win.getClass().getName();
med:
  String cn = "netscape.javascript.JSObject";
Avatar billede arne_v Ekspert
13. januar 2003 - 21:09 #19
Min mistanke er at JSObject er et interface, at getWindow
returnerer en rigtig klasse (og getClass().getName() naturligvis
returnerer naturligvis det rigtige klasse-navn).
Avatar billede bearhugx Nybegynder
13. januar 2003 - 21:10 #20
output :  (egenligt forvenligt)


SB = netscape/javascript/JSObject.class
før Classloader-opslag :
String path = this.getClass().getClassLoader().getSystemResource(sb.toString()).getPath();
Avatar billede arne_v Ekspert
13. januar 2003 - 21:13 #21
Og hvad returnere den lange smøre så ?
Avatar billede bearhugx Nybegynder
13. januar 2003 - 21:18 #22
de tre linier er alt, hvad der udskrives til console :

Som jeg har skrevet i koden ovenfor @ 21:06:00
      // åbenbart kommer koden aldrig forbi her --- "Path = ..." bliver aldrig udskrevet
Avatar billede arne_v Ekspert
13. januar 2003 - 21:19 #23
Bliver den Exception skrevet ud ?
Avatar billede bearhugx Nybegynder
13. januar 2003 - 21:20 #24
Har lige fundet følgende på javas hjemmesider :
ftp://ftp.java.sun.com/docs/j2se1.4.1/developer_guide.pdf (stoffet er fra side 89 og fremefter...)
Avatar billede bearhugx Nybegynder
13. januar 2003 - 21:21 #25
Nope ... Men jeg prøver lige at sende den forbi StdOut istedet...
Avatar billede bearhugx Nybegynder
13. januar 2003 - 21:23 #26
Og det viste en NullPointerException :-(

dvs.
String path = ClassLoader.getSystemResource(sb.toString()).getPath();
, der giver ClassLoader.getSystemResource(...) ikke noget objekt
Avatar billede arne_v Ekspert
13. januar 2003 - 21:23 #27
Ser meget interessant ud, hvis man vil blande applets og JS.

[men jeg så ikke lige sammenhængen med problemet]
Avatar billede arne_v Ekspert
13. januar 2003 - 21:24 #28
Hmmm.

Så er der et eller andet specielt ved applets.
Avatar billede bearhugx Nybegynder
13. januar 2003 - 21:28 #29
Jeg er igang med at lave et eksempel med en hjemmeside, som bliver hele tiden bliver opdateret med nye data - Uden at browseren skal til at reloade dele af siden - i stedet bruges en applet til at hente data - og Javascript til at skrive data'ene de rigtige steder....

Faktisk skulle det blive til en artikel inden længe (Medions har oprettet et site (it-arkiv.dk), hvor der skal ligge artikler om forskellige programmeringsting - men det er lige startet....

Hele interessen med denne, lidt anderledes, måde at gøre det på er inspireret af http://www.eksperten.dk/spm/301871
Avatar billede bearhugx Nybegynder
13. januar 2003 - 21:32 #30
Faldt lige over denne sætning i Developer Guiden
"To compile java code to take advantage of JSObject, you must have the package netscape.javascript in the classpath.
Currently, Java Plug-in 1.3 ships netscape.javascript in a jar file called JAWS.jar. To compile an applet which uses JSObject, add JAWS.jar in the classpath before compilation"
Avatar billede arne_v Ekspert
13. januar 2003 - 21:50 #31
Har du JAWS.jar liggende og hvad er der i den ?
Avatar billede bearhugx Nybegynder
13. januar 2003 - 22:20 #32
Ja .. Den ligger C:\Programmer\Java\j2re1.4.1_01\lib\jaws.jar

Og der kan jeg se at netscape.javascript.JSObject er en abstrakt klasse

derudover kan jeg se at
  sun.plugin.javascript.ocx.JSObject extender den abstrakte klasse
  sun.plugin.javasctipt.JSObject som extender netscape.javascript.JSObject

Derfor er det jo ret sandsynligt, at mit netscape.javascript.JSObject egenligt bruges som et interface i forhold til 
  sun.plugin.javascript.ocx.JSObject
Avatar billede bearhugx Nybegynder
13. januar 2003 - 22:22 #33
(Sikke en skattejagt :-))
Avatar billede bearhugx Nybegynder
13. januar 2003 - 22:23 #34
Men det betyder, at man bare skal sørge for at add'e jaws til classpath og sørge for at browseren har plugin 1.3 eller nyere.... (i think :-)
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