Dynamic Abstract Interface
Croteau, Beau
Beau.Croteau@ca.com
Mon Oct 13 19:14:00 GMT 2008
I'm attempting to build an abstract class definition, something that looks like this, eventually (I want to be able to use it will JNA transparently):
public interface com.sun.jna.examples.BeepExample$Kernel32 extends com.sun.jna.Library
{
public abstract boolean Beep(int, int);
public abstract void Sleep(int);
}
So my first thought was to use define-class, but it doesn't appear that define-class has the fine-grained controls to do something like this.
So I turned to building it by hand using gnu.expr.* and gnu.bytecode.* and using a NEW ArrayClassLoader.
Well this worked, for a static case.
Then the next problem I came across was if I wanted to dynamically update that interface, i.e. add a 'void printf' or something. I couldn't do it because the class definition was 'locked' by the ClassLoader. So, my next step was to generate a hash keeping track of what's stored in our ClassLoader and then creating a fresh ArrayClassLoader and redefining everything from the hash and then updating the static ArrayClassLoader reference. This seemed to work for adding new definitions.
Now the problem I'm having is I can't figure out how to intermingle the ArrayClassLoader definition I had and the ClassLoader used by Kawa.
So if I use the ArrayClassLoader to define an abstract class and then want to reference that class inside of a (define-simple-class...) or (define-class...) statement, it fails because it can't find it in the Kawa ClassLoader.
So, my question is, what's the best way of going about this?
I'm not terribly familiar with the Kawa inner-workings, but my first thought would be to duplicate (define-class) with a (define-interface-class) or something like that. But, I'm not entirely sure where to start and what would ABSOLUTELY be necessary for that to occur.
I know that Kawa supports 'adding' definitions to the ClassLoader because if you do a (define-class <a>...) and then (define-class <a>...more stuff...) it works, so under the covers the ClassLoader is being updated dynamically. So, can I replicate this behaviour in a JAR outside of Kawa for abstract interfaces or does Kawa only support low-level operations like this to occur within the framework?
From,
Beau Croteau
Beau.croteau@ca.com
More information about the Kawa
mailing list