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
Annonceindlæg fra DE-CIX
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
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); }}); } }