View Javadoc
1   /*
2    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3    *
4    * This code is free software; you can redistribute it and/or modify it
5    * under the terms of the GNU General Public License version 2 only, as
6    * published by the Free Software Foundation.  Oracle designates this
7    * particular file as subject to the "Classpath" exception as provided
8    * by Oracle in the LICENSE file that accompanied this code.
9    *
10   * This code is distributed in the hope that it will be useful, but WITHOUT
11   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13   * version 2 for more details (a copy is included in the LICENSE file that
14   * accompanied this code).
15   *
16   * You should have received a copy of the GNU General Public License version
17   * 2 along with this work; if not, write to the Free Software Foundation,
18   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19   *
20   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21   * or visit www.oracle.com if you need additional information or have any
22   * questions.
23   */
24  
25  /*
26   * This file is available under and governed by the GNU General Public
27   * License version 2 only, as published by the Free Software Foundation.
28   * However, the following notice accompanied the original version of this
29   * file:
30   *
31   * ASM: a very small and fast Java bytecode manipulation framework
32   * Copyright (c) 2000-2011 INRIA, France Telecom
33   * All rights reserved.
34   *
35   * Redistribution and use in source and binary forms, with or without
36   * modification, are permitted provided that the following conditions
37   * are met:
38   * 1. Redistributions of source code must retain the above copyright
39   *    notice, this list of conditions and the following disclaimer.
40   * 2. Redistributions in binary form must reproduce the above copyright
41   *    notice, this list of conditions and the following disclaimer in the
42   *    documentation and/or other materials provided with the distribution.
43   * 3. Neither the name of the copyright holders nor the names of its
44   *    contributors may be used to endorse or promote products derived from
45   *    this software without specific prior written permission.
46   *
47   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
48   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
51   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
52   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
53   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
54   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
55   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
56   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
57   * THE POSSIBILITY OF SUCH DAMAGE.
58   */
59  
60  package jdk.internal.org.objectweb.asm;
61  
62  /**
63   * A reference to a field or a method.
64   *
65   * @author Remi Forax
66   * @author Eric Bruneton
67   */
68  public final class Handle {
69  
70      /**
71       * The kind of field or method designated by this Handle. Should be
72       * {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
73       * {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
74       * {@link Opcodes#H_INVOKEVIRTUAL}, {@link Opcodes#H_INVOKESTATIC},
75       * {@link Opcodes#H_INVOKESPECIAL}, {@link Opcodes#H_NEWINVOKESPECIAL} or
76       * {@link Opcodes#H_INVOKEINTERFACE}.
77       */
78      final int tag;
79  
80      /**
81       * The internal name of the class that owns the field or method designated
82       * by this handle.
83       */
84      final String owner;
85  
86      /**
87       * The name of the field or method designated by this handle.
88       */
89      final String name;
90  
91      /**
92       * The descriptor of the field or method designated by this handle.
93       */
94      final String desc;
95  
96      /**
97       * Constructs a new field or method handle.
98       *
99       * @param tag
100      *            the kind of field or method designated by this Handle. Must be
101      *            {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
102      *            {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
103      *            {@link Opcodes#H_INVOKEVIRTUAL},
104      *            {@link Opcodes#H_INVOKESTATIC},
105      *            {@link Opcodes#H_INVOKESPECIAL},
106      *            {@link Opcodes#H_NEWINVOKESPECIAL} or
107      *            {@link Opcodes#H_INVOKEINTERFACE}.
108      * @param owner
109      *            the internal name of the class that owns the field or method
110      *            designated by this handle.
111      * @param name
112      *            the name of the field or method designated by this handle.
113      * @param desc
114      *            the descriptor of the field or method designated by this
115      *            handle.
116      */
117     public Handle(int tag, String owner, String name, String desc) {
118         this.tag = tag;
119         this.owner = owner;
120         this.name = name;
121         this.desc = desc;
122     }
123 
124     /**
125      * Returns the kind of field or method designated by this handle.
126      *
127      * @return {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
128      *         {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
129      *         {@link Opcodes#H_INVOKEVIRTUAL}, {@link Opcodes#H_INVOKESTATIC},
130      *         {@link Opcodes#H_INVOKESPECIAL},
131      *         {@link Opcodes#H_NEWINVOKESPECIAL} or
132      *         {@link Opcodes#H_INVOKEINTERFACE}.
133      */
134     public int getTag() {
135         return tag;
136     }
137 
138     /**
139      * Returns the internal name of the class that owns the field or method
140      * designated by this handle.
141      *
142      * @return the internal name of the class that owns the field or method
143      *         designated by this handle.
144      */
145     public String getOwner() {
146         return owner;
147     }
148 
149     /**
150      * Returns the name of the field or method designated by this handle.
151      *
152      * @return the name of the field or method designated by this handle.
153      */
154     public String getName() {
155         return name;
156     }
157 
158     /**
159      * Returns the descriptor of the field or method designated by this handle.
160      *
161      * @return the descriptor of the field or method designated by this handle.
162      */
163     public String getDesc() {
164         return desc;
165     }
166 
167     @Override
168     public boolean equals(Object obj) {
169         if (obj == this) {
170             return true;
171         }
172         if (!(obj instanceof Handle)) {
173             return false;
174         }
175         Handle h = (Handle) obj;
176         return tag == h.tag && owner.equals(h.owner) && name.equals(h.name)
177                 && desc.equals(h.desc);
178     }
179 
180     @Override
181     public int hashCode() {
182         return tag + owner.hashCode() * name.hashCode() * desc.hashCode();
183     }
184 
185     /**
186      * Returns the textual representation of this handle. The textual
187      * representation is:
188      *
189      * <pre>
190      * owner '.' name desc ' ' '(' tag ')'
191      * </pre>
192      *
193      * . As this format is unambiguous, it can be parsed if necessary.
194      */
195     @Override
196     public String toString() {
197         return owner + '.' + name + desc + " (" + tag + ')';
198     }
199 }