note
jryan
<p>
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. :)
</p>
<p>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.
</p>
<code>
package Inline::Java::Classfile;
sub new {
my ($type, $args) = @_;
Inline->bind(Java => << "__CODE__");
// package org.perl.cpan.inline.java;
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 for 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 for 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);
}
</code>
<p>
Usage would be:
</p>
<code>
my $obj = Inline::Java::Classfile->new("SomeClass", [$cntr_arg1, $arg2, $etc]);
print $obj->hashcode(); # or whatever method
</code>
392445
392445