Home | History | Annotate | Download | only in constant
      1 /*
      2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
      3  *             of Java bytecode.
      4  *
      5  * Copyright (c) 2002-2014 Eric Lafortune (eric (at) graphics.cornell.edu)
      6  *
      7  * This program is free software; you can redistribute it and/or modify it
      8  * under the terms of the GNU General Public License as published by the Free
      9  * Software Foundation; either version 2 of the License, or (at your option)
     10  * any later version.
     11  *
     12  * This program is distributed in the hope that it will be useful, but WITHOUT
     13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
     15  * more details.
     16  *
     17  * You should have received a copy of the GNU General Public License along
     18  * with this program; if not, write to the Free Software Foundation, Inc.,
     19  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
     20  */
     21 package proguard.classfile.constant;
     22 
     23 import proguard.classfile.*;
     24 import proguard.classfile.constant.visitor.ConstantVisitor;
     25 
     26 /**
     27  * This Constant represents a method handle constant in the constant pool.
     28  *
     29  * @author Eric Lafortune
     30  */
     31 public class MethodHandleConstant extends Constant
     32 {
     33     public int u1referenceKind;
     34     public int u2referenceIndex;
     35 
     36 
     37     /**
     38      * An extra field pointing to the java.lang.invoke.MethodHandle Clazz object.
     39      * This field is typically filled out by the <code>{@link
     40      * proguard.classfile.util.ClassReferenceInitializer
     41      * ClassReferenceInitializer}</code>.
     42      */
     43     public Clazz javaLangInvokeMethodHandleClass;
     44 
     45 
     46     /**
     47      * Creates an uninitialized MethodHandleConstant.
     48      */
     49     public MethodHandleConstant()
     50     {
     51     }
     52 
     53 
     54     /**
     55      * Creates a new MethodHandleConstant with the given type and method ref
     56      * index.
     57      * @param u1referenceKind  the reference kind.
     58      * @param u2referenceIndex the index of the field ref constant, interface
     59      *                         method ref constant, or method ref constant in
     60      *                         the constant pool.
     61      */
     62     public MethodHandleConstant(int u1referenceKind, int u2referenceIndex)
     63     {
     64         this.u1referenceKind  = u1referenceKind;
     65         this.u2referenceIndex = u2referenceIndex;
     66     }
     67 
     68 
     69     /**
     70      * Returns the kind of reference to which this constant is pointing.
     71      * @return One of
     72      *         {@link ClassConstants#REF_getField        },
     73      *         {@link ClassConstants#REF_getStatic       },
     74      *         {@link ClassConstants#REF_putField        },
     75      *         {@link ClassConstants#REF_putStatic       },
     76      *         {@link ClassConstants#REF_invokeVirtual   },
     77      *         {@link ClassConstants#REF_invokeStatic    },
     78      *         {@link ClassConstants#REF_invokeSpecial   },
     79      *         {@link ClassConstants#REF_newInvokeSpecial}, or
     80      *         {@link ClassConstants#REF_invokeInterface }.
     81      */
     82     public int getReferenceKind()
     83     {
     84         return u1referenceKind;
     85     }
     86 
     87     /**
     88      * Returns the field ref, interface method ref, or method ref index.
     89      */
     90     public int getReferenceIndex()
     91     {
     92         return u2referenceIndex;
     93     }
     94 
     95 
     96     /**
     97      * Returns the class name.
     98      */
     99     public String getClassName(Clazz clazz)
    100     {
    101         return clazz.getRefClassName(u2referenceIndex);
    102     }
    103 
    104     /**
    105      * Returns the method/field name.
    106      */
    107     public String getName(Clazz clazz)
    108     {
    109         return clazz.getRefName(u2referenceIndex);
    110     }
    111 
    112     /**
    113      * Returns the type.
    114      */
    115     public String getType(Clazz clazz)
    116     {
    117         return clazz.getRefType(u2referenceIndex);
    118     }
    119 
    120 
    121     // Implementations for Constant.
    122 
    123     public int getTag()
    124     {
    125         return ClassConstants.CONSTANT_MethodHandle;
    126     }
    127 
    128     public void accept(Clazz clazz, ConstantVisitor constantVisitor)
    129     {
    130         constantVisitor.visitMethodHandleConstant(clazz, this);
    131     }
    132 }
    133