模块  java.base
软件包  java.lang.invoke

Class CallSite

  • 已知直接子类:
    ConstantCallSiteMutableCallSiteVolatileCallSite

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

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

    • 如果不需要一个可变的靶, invokedynamic指令可永久地用的手段结合constant call site
    • 如果需要具有易失性变量语义的可变目标,因为必须立即且可靠地见证对目标的更新,可以使用volatile call site
    • 否则,如果需要可变目标,则可以使用mutable call site

    可以通过更改其目标来重新链接非常量呼叫站点。 新目标必须与之前的目标具有相同的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