View Javadoc
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  package org.apache.bcel.classfile;
18  
19  import java.io.DataInput;
20  import java.io.DataOutputStream;
21  import java.io.IOException;
22  
23  import org.apache.bcel.Const;
24  
25  /**
26   * This class is derived from the abstract {@link Constant} and represents a reference to a package.
27   *
28   * <p>
29   * Note: Early access Java 9 support- currently subject to change
30   * </p>
31   *
32   * @see Constant
33   * @since 6.1
34   */
35  public final class ConstantPackage extends Constant implements ConstantObject {
36  
37      private int nameIndex;
38  
39      /**
40       * Initialize from another object.
41       *
42       * @param c Source to copy.
43       */
44      public ConstantPackage(final ConstantPackage c) {
45          this(c.getNameIndex());
46      }
47  
48      /**
49       * Initialize instance from file data.
50       *
51       * @param file Input stream
52       * @throws IOException if an I/O error occurs.
53       */
54      ConstantPackage(final DataInput file) throws IOException {
55          this(file.readUnsignedShort());
56      }
57  
58      /**
59       * @param nameIndex Name index in constant pool. Should refer to a ConstantUtf8.
60       */
61      public ConstantPackage(final int nameIndex) {
62          super(Const.CONSTANT_Package);
63          this.nameIndex = nameIndex;
64      }
65  
66      /**
67       * Called by objects that are traversing the nodes of the tree implicitly defined by the contents of a Java class. I.e.,
68       * the hierarchy of methods, fields, attributes, etc. spawns a tree of objects.
69       *
70       * @param v Visitor object
71       */
72      @Override
73      public void accept(final Visitor v) {
74          v.visitConstantPackage(this);
75      }
76  
77      /**
78       * Dump constant package to file stream in binary format.
79       *
80       * @param file Output file stream
81       * @throws IOException if an I/O error occurs.
82       */
83      @Override
84      public void dump(final DataOutputStream file) throws IOException {
85          file.writeByte(super.getTag());
86          file.writeShort(nameIndex);
87      }
88  
89      /**
90       * @return dereferenced string
91       */
92      public String getBytes(final ConstantPool cp) {
93          return (String) getConstantValue(cp);
94      }
95  
96      /**
97       * @return String object
98       */
99      @Override
100     public Object getConstantValue(final ConstantPool cp) {
101         return cp.getConstantUtf8(nameIndex).getBytes();
102     }
103 
104     /**
105      * @return Name index in constant pool of package name.
106      */
107     public int getNameIndex() {
108         return nameIndex;
109     }
110 
111     /**
112      * @param nameIndex the name index in the constant pool of this Constant Package
113      */
114     public void setNameIndex(final int nameIndex) {
115         this.nameIndex = nameIndex;
116     }
117 
118     /**
119      * @return String representation.
120      */
121     @Override
122     public String toString() {
123         return super.toString() + "(nameIndex = " + nameIndex + ")";
124     }
125 }