need little help for class loading & invokeDynamics

Marvin Hansen marvin.hansen at gmail.com
Thu Jan 13 21:15:15 PST 2011


Hi Folks,

I've started to work on invokeDynamics but I need a little help to
understand how to use it right. For learning purpose, I've written a
little class, that loads another class, does the method look-up and
(should) execute the located method. The example in the methodHandle
JavaDoc was my starting point but as usual it's not that easy since it
works well for JDK classes but not with loading my own class which
causes a “NoAccessException”.

I suppose that I need to deal with CallSite & Bootstraping but I've
not yet figured out how to patch class-loading, methodHandle,
Bootstraping & invocation together in order to make it work. The
JavaDoc says, that before an invokedynamic instruction can be executed
a CallSite must be linked  via boostrap method that produces a
methodHandle. That makes sense for me.

However, the CallSite JavaDoc is a little bit short on illustrating
how to use it together with class-loading.
The given example bootstrap Method:

private static CallSite bootstrapDynamic(MethodHandles.Lookup caller,
String name, MethodType type) {
  // ignore caller and name, but match the type:
  return new ConstantCallSite(MethodHandles.collectArguments(printArgs, type));
}

looks fine but this method is neither used nor linked or registered
in the sample code of the JavaDoc so here are my related questions:

1) What is needed in a bootstrap method to produce a working callSite
for a loaded class?

2) How is the bootstrap method linked to  an invokedynamic instruction?
The spec does not have the @BootstrapMethod anymore so what's the
current way of linking?

3) Should the class-loading be done by the bootstrap method or  is it
fine to do it before?


I really appriciate any input, since I'm new to InvokeDynamics and not
familiar with all concepts.

marvin


JDK is b123
JVM Parameter: -Xbootclasspath/main -XX:+UnlockExperimentalVMOptions
-XX:+EnableInvokeDynamic -XX:+EnableMethodHandles

The class file (without any boostraping):

package main;
import java.dyn.*;
public class DynInvoker {
    public static void main(String[] args) throws Throwable {

        String cName = "algorithms.SimpleMath";

        //variable for invokeDynamic
        MethodType methodType;
        MethodHandle methodHandle;
        MethodHandles.Lookup lookup = MethodHandles.lookup();

        //(1) load the class
        Class<?> loadedClaZZ = Class.forName(cName);

        String runMethodName = "run";
        Class retType = int.class;

        // (2) get methodType
        // signature is: public  int run(int a, int b, String op)
        methodType = MethodType.methodType(retType, int.class,
String.class, int.class);

        // (3) look-up the method
        methodHandle = lookup.findVirtual(loadedClaZZ, runMethodName,
methodType);
        /* causes:
         * java.dyn.NoAccessException: cannot access:
*.algorithms.SimpleMath.run(int,String,int)int, from main.DynInvoker
         */

        // (4) do the invokation
        Object o = methodHandle.invokeWithArguments(21, "+", 21);
        System.out.println(o.toString());
    } }

The full Error msg:

Exception in thread "main" java.dyn.NoAccessException: cannot access:
*.algorithms.SimpleMath.run(int,String,int)int, from main.DynInvoker
        at sun.dyn.MemberName.newNoAccessException(MemberName.java:522)
        at sun.dyn.MemberName.newNoAccessException(MemberName.java:516)
        at sun.dyn.MemberName$Factory.resolveOrFail(MemberName.java:653)
        at java.dyn.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:688)
        at java.dyn.MethodHandles$Lookup.findVirtual(MethodHandles.java:413)
        at main.DynInvoker.main(DynInvoker.java:46)
Java Result: 1


More information about the mlvm-dev mailing list