Class.getEnclosingClass() returns null on enclosed class. Specifically: c = class org.freedesktop.DBus$Local$Disconnected c.getEnclosingClass() = null (followed by a null pointer exception on the next line) Code which prints that: if (Debug.debug) Debug.print(Debug.VERBOSE, "c = "+c); if (Debug.debug) Debug.print(Debug.VERBOSE, "c.getEnclosingClass() = "+c.getEnclosingClass()); if (Debug.debug) Debug.print(Debug.VERBOSE, "c.getEnclosingClass().getAnnotation(DBusInterfaceName.class) = "+c.getEnclosingClass().getAnnotation(DBusInterfaceName.class)); if (null != c.getEnclosingClass().getAnnotation(DBusInterfaceName.class)) Source for DBus$Local$Disconnected: public interface DBus extends DBusInterface { .... /** * Messages generated locally in the application. */ public interface Local extends DBusInterface { public class Disconnected extends DBusSignal { public Disconnected(String path) throws DBusException { super(path); } } } .... } GCC version: gcc (GCC) 4.2.3 20071123 (prerelease) (Debian 4.2.2-4) (Also happens in 4.2.2) This code works as expected in Sun JDK 5 and 6 Matt
Here's a complete test case. The .class file does have the InnerClasses attribute, we just don't seem to read it properly. public class p { public interface DBI { } public interface Local extends DBI { public class Disconnected { public Disconnected() { } } } public static void main(String[] args) throws Throwable { Class c = Local.Disconnected.class; System.out.println(c.getEnclosingClass()); } }
Another case where Sun's javadoc was rather vague.
Subject: Bug 34444 Author: aph Date: Fri Jan 4 17:18:56 2008 New Revision: 131326 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=131326 Log: 2008-01-04 Andrew Haley <aph@redhat.com> PR libgcj/34444 * java/lang/natClass.cc (Class::getEnclosingClass): Call getDeclaringClass(). Modified: trunk/libjava/ChangeLog trunk/libjava/java/lang/natClass.cc