On Tue, 12 Jan 2010, Jason Stelzer wrote:


On Jan 11, 2010, at 10:36 PM, Michael wrote:

Hello,

I currently have a need to be able to import classes dyncamically. Now one of 
these classes contains Java and uses Inline::Java. I've not yet successfully 
found a way to do this.

Using an example module as follow:

package Foo;
...
__END__


Here is the output of attempts to use this module in a number of ways.

perl -MFoo -e '$foo = new Foo(); print $foo->jvm_version() . "\n";'
...

perl -e ' BEGIN { require "Foo.pm"; } $foo = new Foo; print $foo->jvm_version() . 
"\n";'


If I'm understanding this correctly, the issue is that you are skipping the 
compile phase of perl's startup when you go down the route of 'require' and 
thus your java code isn't being built and bootstrapped into the perl vm.

The first thing that comes to mind to me is that you could always ensure you 
have a sane CLASSPATH before perl executes and dynamically study specific 
classes on demand at run time.

If you were to package your java code into proper jar files, and set your 
classpath, then you could leverage Inline::Java's study_classes method at 
runtime and dynamically load and study any class that is available to your jvm. 
This assumes that while you don't know which specific class you need, you do 
know what the universe of potential class files are.

Someone probably knows a clever way to get Inline to compile at runtime rather 
than start (compile) time, but it isn't obvious to me how to do it.

If you really need truly dynamic class loading, then the only thing I can 
personally think of off hand is to write a java library that you can load via 
Inline at start time that exposes the needed remote class loader and reflection 
capabilities. But, I have to admit, that sounds like a giant pain to implement.

Hi Jason,

I was actually refering to dynamic PERL modules rather than dynamic Java classes. Sorry I wasn't more specific.

However I did indeed suspect that there was something occuring in the PERL compile phase which Inline and/or Inline::Java required.

Looking through POD and code was going nowhere, until Google pointed me to a CPAN forum post which pointed out that Inline needs to have an init() function called when being imported post compile time.

After adding this call, all seems well and everything is working as expected.

It would be awesome if this apprently public method were documented anywhere in the Inline and/or Inline::Java POD.

Regards

--

Michael Collard

Reply via email to