Avatar billede kernelx Juniormester
17. februar 2009 - 08:19 Der er 3 kommentarer og
1 løsning

få fat i Classes i en package

Hi,

jeg vil gerne have en methode, som kan få fat i klasserne, som ligger i en package:

public Class<?>[] getClasses( String package ) {
  // ???
}


hvordan kan jeg få dette realiseret?

med venlig hilsen
KernelX
Avatar billede arne_v Ekspert
17. februar 2009 - 15:16 #1
En package er jo ikke noedvendigvis bundtet i en enkelt jar eller noedvendigvis i classpath.

Jeg kan ikke komme i tanke om noget smart til dette.

Saa:
- loeb gennem brugte classloadere
- find deres URL'er
- scan dem (File for dirs og java.util.jar for jar filer) for pakken og hvis den er der for klasser
Avatar billede kernelx Juniormester
17. februar 2009 - 17:59 #2
mange tak.
husk at skrive et eller andet som svar :-)
Avatar billede arne_v Ekspert
17. februar 2009 - 18:29 #3
Der er lidt kode til at starte med i:
  http://forums.sun.com/thread.jspa?threadID=341935

Jeg har ogsaa kode til at finde jar filer i classpath og classes i jar filer hvis du er interesseret.

Og et svar.
Avatar billede arne_v Ekspert
23. februar 2009 - 02:56 #4
Lidt kode:

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class ClassFind {
    public interface CallBack {
        public boolean match(String clznam, String src);
        public void process(String clznam, String src);
    }
   
    private void foundFile(String basedirnam, String fnm, CallBack cb) {
        String clznam = fnm.substring(basedirnam.length()).replace('/', '.').replace(".class", "");
        if(cb.match(clznam, fnm)) {
            cb.process(clznam, fnm);
        }
    }
    private void findDir(String basedirnam, String dirnam, CallBack cb) {
        File dir = new File(dirnam);
        String[] dirlist = dir.list();
        for(int i = 0; i < dirlist.length; i++) {
            String fnm = dirnam + dirlist[i];
            if ((new File(fnm)).isDirectory()) {
                findDir(basedirnam, fnm + "/", cb);
            } else if(fnm.endsWith(".class")) {
                foundFile(basedirnam, fnm, cb);
            }
        }
    }
    private void foundJar(String jarnam, String clznam, CallBack cb) {
        if(cb.match(clznam, jarnam)) {
            cb.process(clznam, jarnam);
        }
    }
    private void findJar(String jarnam, CallBack cb) {
        try {
            JarFile jf = new JarFile(jarnam);
            Enumeration<JarEntry> e = jf.entries();
            while(e.hasMoreElements()) {
                JarEntry je = e.nextElement();
                String clznam = je.getName().replace('/', '.');
                if(clznam.endsWith(".class")) {
                    foundJar(jarnam, clznam, cb);
                }
            }
        } catch (IOException e) {
        }
    }
    private void find(URL url, CallBack cb) {
        if(url.getProtocol().equals("file")) {
            String fnm = url.toExternalForm().replace("file:/", "");
            File f = new File(fnm);
            if(f.isDirectory()) {
                findDir(fnm, fnm, cb);
            } else {
                findJar(fnm, cb);
            }
           
        }
    }
    public void find(CallBack cb) {
        ClassLoader cl = ClassFind.class.getClassLoader();
        while(cl != null) {
            if(cl instanceof URLClassLoader) {
                URL[] urls = ((URLClassLoader)cl).getURLs();
                for(int i = 0; i < urls.length; i++) {
                    find(urls[i], cb);
                }
            }
            cl = cl.getParent();
        }
    }
    public static void main(String[] args) {
        ClassFind cf = new ClassFind();
        cf.find(new ClassFind.CallBack() {
                  public boolean match(String clznam, String src) {
                      return clznam.startsWith("dk.");
                  }
                  public void process(String clznam, String src) {
                      System.out.println(clznam + " in " + src);
                  }});
    }
}
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