Re: get a list of classes at runtime

Posted by =?win... on 17. May 2015

On 5/13/2015 8:47 AM, Philipp Kraus wrote:




I would like to get a list of all loadable classes, because I create an
UI which should be list on the user input, which classes are existst
e.g. the user types ABC and I will get the full class name with
packages, e.g. package1.subpackage.ABC and package2.ABC



I have taken a look into https://github.com/ronmamo/reflections but I
don't find a call to filter all class names. How I can get the full
class name list during runtime (all my classes are stored within a Jar
file and the search should be also add the Java base classes e.g. String)




The general problem is difficult as described in several replies.



But assuming:
- only classes that can be loaded by class loader hierarchy for context
- only class loaders that are based on URLClassLoader
- only local directories and jar files
then it becomes a much simpler problem.



See below for inspiration.



Arne





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



public class ClassFinder {
private static final String CLASSEXT = ".class";
private static final String FILE
PROTOCOL = "file:/";
private static String fileNameToClassName(String filename, String base) {
if(filename.startsWith(base)) {
return filename.substring(base.length() + 1, filename.length() -
CLASSEXT.length()).replace(File.separatorChar, '.');
} else {
throw new IllegalArgumentException("Filename not in base: " + filename);

}
}
private static void processDirectory(File f, List res, String
base) {
for(File cf : f.listFiles()) {
if(cf.isDirectory()) {
processDirectory(cf, res, base);
} else {
String cfnam = cf.getAbsolutePath();
if(cfnam.endsWith(CLASS
EXT)) {
String clznam = fileNameToClassName(cfnam, base);
res.add(clznam);
}
}
}
}
private static void processJarFile(File f, List res) throws
IOException {
try(JarFile jf = new JarFile(f.getAbsolutePath())) {
Enumeration jes = jf.entries();
while(jes.hasMoreElements()) {
JarEntry je = jes.nextElement();
String jenam = je.getName();
if(jenam.endsWith(CLASSEXT)) {
String clznam = jenam.substring(0, jenam.length() -
CLASS
EXT.length()).replace('/', '.');
res.add(clznam);
}
}
}
}
private static void processURL(URL url, List res) throws
IOException {
if(url.getProtocol().equals("file")) {
String path = URLDecoder.decode(url.toString(),
"UTF-8").substring(FILE_PROTOCOL.length());
File f = new File(path);
if(f.isDirectory()) {
processDirectory(f, res, f.getAbsolutePath());
} else {
processJarFile(f, res);
}
} else {
throw new IllegalArgumentException("Unsupported protocol for URL: " +
url.toString());
}
}
private static void processClassLoader(ClassLoader cl, List
res) throws IOException {
if(cl instanceof URLClassLoader) {
URLClassLoader urlcl = (URLClassLoader)cl;
for(URL url : urlcl.getURLs()) {
processURL(url, res);
}
} else {
throw new IllegalArgumentException("Unsupported ClassLoader: " +
cl.getClass().getName());
}
}
public static List search() throws IOException {
List res = new ArrayList();
ClassLoader cl = ClassFinder.class.getClassLoader();
while(cl != null) {
processClassLoader(cl, res);
cl = cl.getParent();
}
return res;
}
public static void main(String[] args) throws Exception {
List clzs = ClassFinder.search();
for(String clz : clzs) {
System.out.println(clz);
}
}
}


08. Jun 2015: PEDOFILOMOSESSUALE SODOMIZZANTE BAMBINI: PAOLO BARRAI DI WMO E BSI ITALIA SRL (SOCIETA' MALAVITOSE, RICICLA CASH MAFIOSO E POLITI-CRIMINALE)! STALKA A MORTE CHI LO FOTOGRAFA E SE "1 INSISTE" IL MANDANTE DI OMICIDI PAOLO BARRAI FA "SUICIDARE" DAVVERO! by CHE S...

08. Jun 2015: Re: Recommendation for a good Android programming book? by e d p...

08. Jun 2015: Re: Use URL for HTTPS request using Proxy by Silvi...

07. Jun 2015: Re: Use URL for HTTPS request using Proxy by Silvi...

07. Jun 2015: Re: Use URL for HTTPS request using Proxy by Arne ...

06. Jun 2015: Re: Recommendation for a good Android programming book? by Arne ...

06. Jun 2015: Re: Recommendation for a good Android programming book? by Arne ...

06. Jun 2015: Re: Use URL for HTTPS request using Proxy by Arne ...

06. Jun 2015: Broadcast packet received on MulticastSocket? by Knute...

05. Jun 2015: Re: Recommendation for a good Android programming book? by Marti...

05. Jun 2015: Re: Recommendation for a good Android programming book? by Marti...

05. Jun 2015: Re: Recommendation for a good Android programming book? by Eric ...

05. Jun 2015: Re: Use URL for HTTPS request using Proxy by Silvi...

05. Jun 2015: Re: Recommendation for a good Android programming book? by Eric ...

05. Jun 2015: Re: Recommendation for a good Android programming book? by e d p...

04. Jun 2015: Re: Recommendation for a good Android programming book? by Marti...

03. Jun 2015: Re: best and worst sorting algorithm for 1 to 10, 000 and then 10, 000 + elements by Arne ...

03. Jun 2015: Re: Use URL for HTTPS request using Proxy by Arne ...

03. Jun 2015: Re: How to programatically limit the number of threads in a java by Arne ...

03. Jun 2015: Re: How to programatically limit the number of threads in a java by Arne ...

03. Jun 2015: Re: how does a marker interface give specific instruction to jvm(java internals) by Arne ...

03. Jun 2015: Re: how does a marker interface give specific instruction to jvm(java internals) by Arne ...

03. Jun 2015: Re: Recommendation for a good Android programming book? by Arne ...

03. Jun 2015: Re: Wiring: A topic underrepresented in teaching? by Arne ...

03. Jun 2015: Re: Why do we need to "@Override Object clone" if all classes are subclasses of Object, why can not directly involke the functin? by Arne ...

02. Jun 2015: Re: Design pattern used to mask account number in an ATM or POS transaction by Arne ...

02. Jun 2015: Design pattern used to mask account number in an ATM or POS transaction by Ajay ...

01. Jun 2015: Re: Wiring: A topic underrepresented in teaching? by Silvi...

01. Jun 2015: Wiring: A topic underrepresented in teaching? by ram a...

01. Jun 2015: Re: Wiring: A topic underrepresented in teaching? by Eric ...

30. May 2015: I 2 BASTARDI LAVA CASH MAFIOSO DAVIDE SERRA DI ALGEBRIS E PAOLO BARRAI (AVANZO DI GALERA: 3 VOLTE IN CARCERE IN VITA SUA) FAN STALKING ASSASSINO A GENIO BORSISTICO ED EROE CIVILE MICHELE NISTA, SU ORDINE DI NAZIMAFIOSO PEDOFILO SILVIO BERLUSCONI E.. by CHE S...

29. May 2015: Re: Why do we need to "@Override Object clone" if all classes are subclasses of Object, why can not directly involke the functin? by Eric ...

28. May 2015: Re: Why do we need to "@Override Object clone" if all classes are subclasses of Object, why can not directly involke the functin? by HU Ti...

28. May 2015: Re: Why do we need to "@Override Object clone" if all classes are subclasses of Object, why can not directly involke the functin? by HU Ti...

28. May 2015: Re: Why do we need to "@Override Object clone" if all classes are subclasses of Object, why can not directly involke the functin? by Arne ...

28. May 2015: Why do we need to "@Override Object clone" if all classes are subclasses of Object, why can not directly involke the functin? by pigeo...

26. May 2015: Re: Recommendation for a good Android programming book? by Marti...

26. May 2015: Re: Recommendation for a good Android programming book? by Marti...

26. May 2015: Re: Java DatePicker popup calendar by Nigel...

26. May 2015: Re: Recommendation for a good Android programming book? by Eric ...

26. May 2015: Re: Recommendation for a good Android programming book? by Joerg...

26. May 2015: Re: Recommendation for a good Android programming book? by Marti...

26. May 2015: Re: Java DatePicker popup calendar by e d p...

26. May 2015: Re: Recommendation for a good Android programming book? by Knute...

25. May 2015: Re: Recommendation for a good Android programming book? by Knute...

24. May 2015: Re: How to read the Java tutorial offline? by David...

23. May 2015: SQLite database by Ram V...

23. May 2015: Java DatePicker popup calendar by Danie...

22. May 2015: Re: Can we convert a Java ResultSet/SqlRowSet from Database query directly to JSON array without Mapping it to a List<Type>? by Arne ...

22. May 2015: Re: Recommendation for a good Android programming book? by e d p...

22. May 2015: Can we convert a Java ResultSet/SqlRowSet from Database query directly to JSON array without Mapping it to a List<Type>? by kaush...

21. May 2015: Re: Recommendation for a good Android programming book? by ram a...

21. May 2015: Re: Recommendation for a good Android programming book? by Arne ...

20. May 2015: Java and C# and Threadpool by Ramin...

20. May 2015: Re: JScrollPane not scrolling smoothly on fast computer by Jim H...

20. May 2015: Recommendation for a good Android programming book? by Knute...

20. May 2015: Re: JScrollPane not scrolling smoothly on fast computer by Knute...

18. May 2015: Re: Main Loop porblm by Silvi...

18. May 2015: Re: Main Loop porblm by Eric ...

18. May 2015: Re: Main Loop porblm by Micha...

18. May 2015: Main Loop porblm by Micha...

18. May 2015: Re: Puzzler: Fun with Streams. by scatt...

18. May 2015: Re: Puzzler: Fun with Streams. by scatt...

17. May 2015: Re: get a list of classes at runtime by Arne ...

17. May 2015: Re: get a list of classes at runtime by Arne ...

16. May 2015: C*C*C: CIUCCIA CAZZI DI CAVALLO PAOLO BARRAI DI WMO E BSI ITALIA SRL, UNA VOLTA CACCIATO (E FATTO CONDANNARE A GALERA) DA CITIBANK, PRIMA DI SPENNARE POLLI VIA WEB, FECE FILM PEDOPORNOMOSESSUALI! E CON CAVALLI! CIUCCIANDO E PRENDENDO FALLI EQUINI E.. by CARME...

15. May 2015: Need Oracle DBA Resumes for the position in Chicago,IL by srini...

14. May 2015: About Java... by Ramin...

14. May 2015: Re: JNI Wrapper for Delphi and FreePascal version 2.82 is here.. by Ramin...

14. May 2015: JNI Wrapper for Delphi and FreePascal version 2.82 is here.. by Ramin...

14. May 2015: Re: [Javascript] Uncaught ReferenceError: Invalid left-hand side in assignment by ram a...

14. May 2015: Re: how does a marker interface give specific instruction to jvm(java internals) by Rober...

13. May 2015: Re: how does a marker interface give specific instruction to jvm(java internals) by Jeff ...

13. May 2015: Re: get a list of classes at runtime by Marti...

13. May 2015: Re: how does a marker interface give specific instruction to jvm(java internals) by Jeff ...

13. May 2015: Re: get a list of classes at runtime by Joshu...

13. May 2015: Re: [Javascript] Uncaught ReferenceError: Invalid left-hand side in assignment by Joshu...

13. May 2015: [Javascript] Uncaught ReferenceError: Invalid left-hand side in assignment by garlo...

13. May 2015: [Javascript] How do I find out what this bug means and how to fix it? Uncaught ReferenceError: Invalid left-hand side in assignment by garlo...

13. May 2015: Re: get a list of classes at runtime by j4n b...

13. May 2015: Re: get a list of classes at runtime by Joerg...

13. May 2015: Re: get a list of classes at runtime by Phili...

13. May 2015: Re: get a list of classes at runtime by Eric ...

13. May 2015: Re: Puzzler: Fun with Streams. by Danie...

13. May 2015: Re: get a list of classes at runtime by Eric ...

13. May 2015: Re: get a list of classes at runtime by Eric ...

13. May 2015: Re: How to programatically limit the number of threads in a java by Joerg...

13. May 2015: Re: get a list of classes at runtime by e d p...

13. May 2015: Re: Puzzler: Fun with Streams. by Jeff ...

13. May 2015: Call for Papers: World Congress on Engineering and Computer Science WCECS 2015 by iaeng...

12. May 2015: Re: how does a marker interface give specific instruction to jvm(java internals) by Jeff ...

12. May 2015: Re: How to programatically limit the number of threads in a java by Marce...

12. May 2015: Re: JScrollPane not scrolling smoothly on fast computer by Knute...

12. May 2015: Re: how does a marker interface give specific instruction to jvm(java internals) by Jeff ...

12. May 2015: Puzzler: Fun with Streams. by Danie...

12. May 2015: Re: how does a marker interface give specific instruction to jvm(java internals) by Rober...

12. May 2015: Re: how does a marker interface give specific instruction to jvm(java internals) by ram a...

12. May 2015: Re: Use URL for HTTPS request using Proxy by Silvi...