Module  java.base
软件包  java.lang.invoke

Class CallSite

  • 已知直接子类:
    ConstantCallSiteMutableCallSiteVolatileCallSite


    public abstract class CallSite
    extends Object
    A CallSite是变量MethodHandle的持有人,它被称为其target 链接到CallSiteinvokedynamic指令将对站点的当前目标的所有调用委托。 A CallSite可能与几个invokedynamic指令相关联,或者它可能是“自由浮动”,与无关联。 在任何情况下,它可以通过称为其dynamic invoker的关联方法句柄来调用。

    CallSite是一个抽象类,不允许用户直接进行子类化。 它有三个立即具体的子类,可以被实例化或子类化。

    通过更改其目标可以重新链接非常数呼叫站点。 新的目标必须与以前的目标相同的type 因此,虽然呼叫站点可以重新链接到一系列连续的目标,但它不能改变其类型。

    以下是使用呼叫站点和引导方法的示例,它们链接每个动态调用站点以打印其参数:

    
    static void test() throws Throwable {
        // THE FOLLOWING LINE IS PSEUDOCODE FOR A JVM INSTRUCTION
        InvokeDynamic[#bootstrapDynamic].baz("baz arg", 2, 3.14);
    }
    private static void printArgs(Object... args) {
      System.out.println(java.util.Arrays.deepToString(args));
    }
    private static final MethodHandle printArgs;
    static {
      MethodHandles.Lookup lookup = MethodHandles.lookup();
      Class thisClass = lookup.lookupClass();  // (who am I?)
      printArgs = lookup.findStatic(thisClass,
          "printArgs", MethodType.methodType(void.class, Object[].class));
    }
    private static CallSite bootstrapDynamic(MethodHandles.Lookup caller, String name, MethodType type) {
      // ignore caller and name, but match the type:
      return new ConstantCallSite(printArgs.asType(type));
    }
    
    从以下版本开始:
    1.7