On May 18, 2009, at 6:57 PM, Yehuda Katz wrote:

I've pretty much achieved everything I was trying to do last night: 
http://gist.github.com/113717

Congratulations!

Ideally, I'd like to be able to do something like:

    Object invoke(DynamicTester tester, Object... objects) {
      return target.invoke(tester, name, objects);
    }

Where the original method could be methodNotFound(name, String... name) or whatever.

Again, I'm relatively new to all this, so I'm pretty sure what I want to do is either a big no-no or a no-brainer.

It's a common use case: You have an indy site with a specific type (e.g., (String)->String) and you want to route calls from there to a generic method. The way to make up the difference between method handles types (calling sequences) is to use one of MethodHandles. {convert,spread,collect}Arguments.

In your use case (as is common) there are two method handles in play, the ultimate target (the handle to methodNotFound), and the immediate target (your MethodMissingHandle object). Either (or both) might differ in their type from the call site's type. In that case, the difference must be made up with one of the *Arguments calls.

BTW, as a matter of style, if a class defines methods which are expected to be used via method handles, and by multiple clients, it's probably a good idea for the class to provide access to those methods in the form of method handles, whether or not it also provides them as directly callable (named) methods. E.g.:

public class DynamicTester {
  public String methodNotFound(String name, String extra) {
    return name + extra;
  }
  public static final MethodHandle METHOD_NOT_FOUND = ...;
  // OR:
public MethodHandle methodNotFound() { return /*private*/ METHOD_NOT_FOUND; }
}

-- John
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to