1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.bcel.classfile; 19 20 import java.io.DataInput; 21 import java.io.DataOutputStream; 22 import java.io.IOException; 23 24 import org.apache.bcel.Const; 25 26 /** 27 * Entry of the parameters table. 28 * 29 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.24"> 30 * The class File Format : The MethodParameters Attribute</a> 31 * @since 6.0 32 */ 33 public class MethodParameter implements Cloneable { 34 35 /** Index of the CONSTANT_Utf8_info structure in the constant_pool table representing the name of the parameter */ 36 private int name_index; 37 38 /** The access flags */ 39 private int access_flags; 40 MethodParameter()41 public MethodParameter() { 42 } 43 44 /** 45 * Construct object from input stream. 46 * 47 * @param input Input stream 48 * @throws java.io.IOException 49 * @throws ClassFormatException 50 */ MethodParameter(final DataInput input)51 MethodParameter(final DataInput input) throws IOException { 52 name_index = input.readUnsignedShort(); 53 access_flags = input.readUnsignedShort(); 54 } 55 getNameIndex()56 public int getNameIndex() { 57 return name_index; 58 } 59 setNameIndex(final int name_index)60 public void setNameIndex(final int name_index) { 61 this.name_index = name_index; 62 } 63 64 /** 65 * Returns the name of the parameter. 66 */ getParameterName(final ConstantPool constant_pool)67 public String getParameterName(final ConstantPool constant_pool) { 68 if (name_index == 0) { 69 return null; 70 } 71 return ((ConstantUtf8) constant_pool.getConstant(name_index, Const.CONSTANT_Utf8)).getBytes(); 72 } 73 getAccessFlags()74 public int getAccessFlags() { 75 return access_flags; 76 } 77 setAccessFlags(final int access_flags)78 public void setAccessFlags(final int access_flags) { 79 this.access_flags = access_flags; 80 } 81 isFinal()82 public boolean isFinal() { 83 return (access_flags & Const.ACC_FINAL) != 0; 84 } 85 isSynthetic()86 public boolean isSynthetic() { 87 return (access_flags & Const.ACC_SYNTHETIC) != 0; 88 } 89 isMandated()90 public boolean isMandated() { 91 return (access_flags & Const.ACC_MANDATED) != 0; 92 } 93 94 /** 95 * Dump object to file stream on binary format. 96 * 97 * @param file Output file stream 98 * @throws IOException 99 */ dump(final DataOutputStream file)100 public final void dump(final DataOutputStream file) throws IOException { 101 file.writeShort(name_index); 102 file.writeShort(access_flags); 103 } 104 105 /** 106 * @return deep copy of this object 107 */ copy()108 public MethodParameter copy() { 109 try { 110 return (MethodParameter) clone(); 111 } catch (final CloneNotSupportedException e) { 112 // TODO should this throw? 113 } 114 return null; 115 } 116 } 117