How to get list of classes from a package
Martin Buchholz
martinrb at google.com
Mon Feb 16 22:08:37 UTC 2009
Ulf,
This kind of solution is likely to be brittle.
For example, you appear to assume that the code
you are looking for is in a jar file. But it might not be;
in jdk "developer mode", they are likely to be in
a "classes" directory.
Martin
On Mon, Feb 16, 2009 at 13:30, Ulf Zibis <Ulf.Zibis at gmx.de> wrote:
> Am 16.02.2009 21:35, Rémi Forax schrieb:
>>
>> Tom Hawtin a écrit :
>>>
>>> David M. Lloyd wrote:
>>>>
>>>> On 02/16/2009 10:22 AM, Ulf Zibis wrote:
>>>>>
>>>>> can anybody tell me, how I could get al list or enumeration of the
>>>>> classes, which belong to a package.
>>>>> I can't see any appropriate method in java.lang.Package :-(
>>>>
>>>> This isn't really possible at run time, since one doesn't know whether a
>>>> class exists until one tries to load it. The classloader might not even
>>>> know. Also, a package can span classloaders, adding more complexity to the
>>>> problem.
>>>
>>> IIRC, you will get a different Package for each class loader, for a given
>>> package name. Certainly classes with the same package name will not have
>>> Java access to default/protected members/classes/interface/constructors from
>>> different class loaders.
>>>
>>> But yes, a list of classes is not necessarily complete. Also, IIRC, Proxy
>>> dynamically inserts classes into packages as well.
>>>
>>> Tom Hawtin
>>
>> Ulf, if you can create an agent, you can get all loaded classes:
>>
>> http://download.java.net/jdk7/docs/api/java/lang/instrument/Instrumentation.html#getAllLoadedClasses()
>>
>> But if you want thoses classes to find some that implement an interface,
>> java.util.ServiceLoader is your friend:
>> http://download.java.net/jdk7/docs/api/java/util/ServiceLoader.html
>>
>> cheers,
>> Rémi
>>
>
> Hi David, Tom and Rémi,
>
> very much thanks for your hints. They were really valuable. :-)
> I just finished to code a tricky solution:
>
> package sun.nio.cs;
>
> import java.io.*;
> import java.net.*;
> import java.nio.charset.*;
> import java.util.*;
> import java.util.jar.*;
>
> /**
> *
> * @author Ulf Zibis <Ulf.Zibis at CoSoCo.de>
> */
> public class LegacyCharsets {
>
> private static StandardCharsets standChars = new StandardCharsets();
> // Maps lowered canonical names to legacy class names
> static final Map<String,String> legacyClassNameMap;
>
> static {
> legacyClassNameMap = new HashMap(256);
> collectLegacyClassNames("StandardCharsets.class");
> collectLegacyClassNames("ext/DelegatableDecoder.class");
> }
>
> @SuppressWarnings("static-access")
> private static void collectLegacyClassNames(String searchAnchor) {
> String[] paths =
> LegacyCharsets.class.getResource(searchAnchor).getPath().split("!");
> paths[1] = paths[1].substring(paths[1].indexOf('/')+1,
> paths[1].lastIndexOf('/'));
> try {
> Enumeration<JarEntry> en = new JarFile(new File(new
> URI(paths[0]))).entries();
> while (en.hasMoreElements()) {
> String name = en.nextElement().getName();
> int extPos;
> if (name.indexOf('$') < 0 && name.startsWith(paths[1]) &&
> (extPos = name.indexOf(".class")) > 0) {
> Class c = Class.forName(name.substring(0,
> extPos).replace('/', '.'),
> true, LegacyCharsets.class.getClassLoader());
> if (Charset.class.isAssignableFrom(c)) try {
>
> legacyClassNameMap.put(standChars.toLower(((Charset)c.newInstance()).name()),
>
> c.getName().substring("sun.nio.cs.".length()));
> } catch (IllegalAccessException iae) {
> } catch (InstantiationException ie) {}
> }
> }
> } catch (Exception ex) {
> System.err.println(ex);
> }
> }
>
> @SuppressWarnings("static-access")
> static Charset legacyCharset(String canonicalName) {
> return
> standChars.newCharsetForClassName(legacyClassNameMap.get(standChars.toLower(canonicalName)));
> }
> }
>
>
>
More information about the core-libs-dev
mailing list