Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Re: Using Java methods in perl

by jryan (Vicar)
on Sep 20, 2004 at 21:24 UTC ( #392502=note: print w/replies, xml ) Need Help??

in reply to Using Java methods in perl

I was sitting in the middle of a boring presentation, and I saw this post and thought "Hey, I'm pretty bored at the moment, I'll write an auto-dispatcher for him!". Of course, by the I finished it, samtregar had already responded with the correct solution. :)

But, I'm going to post my solution anyways (even though it definitely isn't the optimal solution here), just because you might find it interesting. Also note that I do not have java/perl access on the lab computers that we are using, so this code is most definitely untested.

package Inline::Java::Classfile; sub new { my ($type, $args) = @_; Inline->bind(Java => << "__CODE__"); // package; import java.lang.*; import java.lang.reflect.*; class InlineJavaDispatcher { protected $type inst; public InlineJavaDispatcher(Object[] args) throws InstantiationException ,IllegalAccessException ,IllegalArgumentException ,InvocationTargetException ,SecurityException { Class clazz = $type.class; Constructor[] cntrs = clazz.getDeclaredConstructors(); for (int i=0; i < cntrs.length(); i++) { try { inst = cntrs[i].newInstance(args); return; } catch (IllegalArgumentException e) { } } throw new IllegalArgumentException( methodName + " was not found for the arguments supplied fo +r Class $type." ); } public Object dispatch(String methodName ,Object[] args) throws IllegalAccessException ,IllegalArgumentException ,InvocationTargetException ,NullPointerException ,ExceptionInInitializerError { Class clazz = inst.getClass(); Method am[] = inst.getDeclaredMethods(); for (int i=0; i < am.length; i++) { if (am[i].getName().equals(methodName)) { try { return am[i].invoke(inst, args); } catch (IllegalArgumentException e) { } } } throw new IllegalArgumentException( methodName + " was not found for the arguments supplied fo +r Class $type." ); } } __CODE__ return InlineJavaDispatcher->new($args); } sub AUTOLOAD { my ($self,$args) = shift; my $type = ref($self) or croak "$self is not an object"; my $name = $AUTOLOAD; $name =~ s/.*://; # strip fully-qualified portion $self->dispatch($name, $args); }

Usage would be:

my $obj = Inline::Java::Classfile->new("SomeClass", [$cntr_arg1, $ +arg2, $etc]); print $obj->hashcode(); # or whatever method

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://392502]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (5)
As of 2021-10-25 10:32 GMT
Find Nodes?
    Voting Booth?
    My first memorable Perl project was:

    Results (89 votes). Check out past polls.