[Kde-java] QtJava api via Dynamic Proxies progress - part 1

Tom Tromey tromey at redhat.com
Thu Aug 21 13:51:09 CEST 2003


>>>>> "Tom" == Tom Tromey <tromey at redhat.com> writes:

Tom> The simplest fix may be to change Proxy to compute the package name
Tom> itself, from the class name, rather than to go through the Package.
Tom> This won't fix the appended, but there's no guarantee that
Tom> getPackage() will return a non-null result.

I looked into this some more.  Fixing libgcj to set the Package on a
compiled class is pretty complicated, as it gets into problems with
the ordering of class initialization at startup.

So I gave up on that approach and put a note in bugzilla.

I wrote the appended, but I'm not really certain it is correct.
Perhaps we really do need to use the Package and not just the
package's name.

I've CCd Eric Blake, who wrote Proxy, and can hopefully advise.

Tom

Index: ChangeLog
from  Tom Tromey  <tromey at redhat.com>

	* java/lang/reflect/Proxy.java (ProxyData): `pack' now a String.
	(ProxyData.getPackage): New method.
	(ProxyData.getProxyData): Use package name, not Package.
	(ClassFactory.ClassFactory): Updated.

Index: java/lang/reflect/Proxy.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/reflect/Proxy.java,v
retrieving revision 1.3
diff -u -r1.3 Proxy.java
--- java/lang/reflect/Proxy.java 29 Mar 2003 01:34:23 -0000 1.3
+++ java/lang/reflect/Proxy.java 21 Aug 2003 18:33:35 -0000
@@ -1,5 +1,5 @@
 /* Proxy.java -- build a proxy class that implements reflected interfaces
-   Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -733,7 +733,7 @@
      * The package this class is in.  Possibly null, meaning the unnamed
      * package.
      */
-    Package pack;
+    String pack;
 
     /**
      * The interfaces this class implements.  Non-null, but possibly empty.
@@ -777,6 +777,21 @@
     }
 
     /**
+     * Return the name of a package given the name of a class.
+     * Returns null if no package.  We use this in preference to
+     * using Class.getPackage() to avoid problems with ClassLoaders
+     * that don't set the package.
+     */
+    static String getPackage(Class k)
+    {
+      String name = k.getName();
+      int idx = name.lastIndexOf('.');
+      if (idx >= 0)
+	return name.substring(0, idx);
+      return null;
+    }
+
+    /**
      * Verifies that the arguments are legal, and sets up remaining data
      * This should only be called when a class must be generated, as
      * it is expensive.
@@ -818,8 +833,8 @@
           if (! Modifier.isPublic(inter.getModifiers()))
             if (in_package)
               {
-                Package p = inter.getPackage();
-                if (data.pack != inter.getPackage())
+		String p = getPackage(inter);
+                if (! data.pack.equals(p))
                   throw new IllegalArgumentException("non-public interfaces "
                                                      + "from different "
                                                      + "packages");
@@ -827,7 +842,7 @@
             else
               {
                 in_package = true;
-                data.pack = inter.getPackage();
+                data.pack = getPackage(inter);
               }
           for (int j = i-1; j >= 0; j--)
             if (data.interfaces[j] == inter)
@@ -954,7 +969,7 @@
       // access_flags
       putU2(Modifier.SUPER | Modifier.FINAL | Modifier.PUBLIC);
       // this_class
-      qualName = ((data.pack == null ? "" : data.pack.getName() + '.')
+      qualName = ((data.pack == null ? "" : data.pack + '.')
                   + "$Proxy" + data.id);
       putU2(classInfo(TypeSignature.getEncodingOfClass(qualName, false)));
       // super_class


More information about the Kde-java mailing list