1 /*
   2  * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package java.lang.invoke;
  27 import java.lang.invoke.MethodHandleNatives.Constants;
  28 
  29 //Not yet public: public
  30 class MethodHandleInfo {
  31    public static final int
  32        REF_getField                = Constants.REF_getField,
  33        REF_getStatic               = Constants.REF_getStatic,
  34        REF_putField                = Constants.REF_putField,
  35        REF_putStatic               = Constants.REF_putStatic,
  36        REF_invokeVirtual           = Constants.REF_invokeVirtual,
  37        REF_invokeStatic            = Constants.REF_invokeStatic,
  38        REF_invokeSpecial           = Constants.REF_invokeSpecial,
  39        REF_newInvokeSpecial        = Constants.REF_newInvokeSpecial,
  40        REF_invokeInterface         = Constants.REF_invokeInterface;
  41 
  42    private final Class<?> declaringClass;
  43    private final String name;
  44    private final MethodType methodType;
  45    private final int referenceKind;
  46 
  47    public MethodHandleInfo(MethodHandle mh) {
  48        MemberName mn = mh.internalMemberName();
  49        if (mn == null)  throw new IllegalArgumentException("not a direct method handle");
  50        this.declaringClass = mn.getDeclaringClass();
  51        this.name = mn.getName();
  52        this.methodType = mn.getMethodOrFieldType();
  53        byte refKind = mn.getReferenceKind();
  54        if (refKind == REF_invokeSpecial && !mh.isInvokeSpecial())
  55            // Devirtualized method invocation is usually formally virtual.
  56            refKind = REF_invokeVirtual;
  57        this.referenceKind = refKind;
  58    }
  59 
  60    public Class<?> getDeclaringClass() {
  61        return declaringClass;
  62    }
  63 
  64    public String getName() {
  65        return name;
  66    }
  67 
  68    public MethodType getMethodType() {
  69        return methodType;
  70    }
  71 
  72    public int getReferenceKind() {
  73        return referenceKind;
  74    }
  75 }