javap/src/main/java/org/apidesign/javap/FieldData.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 07 Feb 2013 13:07:22 +0100
branchemul
changeset 695 dbcd1a21f3f8
parent 246 89ad48aa8705
parent 240 4e88a33d7972
permissions -rw-r--r--
Merging in long arithmetic, otherwise the zip support won't work
jtulach@144
     1
/*
jtulach@144
     2
 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
jtulach@144
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
jtulach@144
     4
 *
jtulach@144
     5
 * This code is free software; you can redistribute it and/or modify it
jtulach@144
     6
 * under the terms of the GNU General Public License version 2 only, as
jtulach@144
     7
 * published by the Free Software Foundation.  Oracle designates this
jtulach@144
     8
 * particular file as subject to the "Classpath" exception as provided
jtulach@144
     9
 * by Oracle in the LICENSE file that accompanied this code.
jtulach@144
    10
 *
jtulach@144
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
jtulach@144
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
jtulach@144
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
jtulach@144
    14
 * version 2 for more details (a copy is included in the LICENSE file that
jtulach@144
    15
 * accompanied this code).
jtulach@144
    16
 *
jtulach@144
    17
 * You should have received a copy of the GNU General Public License version
jtulach@144
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
jtulach@144
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
jtulach@144
    20
 *
jtulach@144
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
jtulach@144
    22
 * or visit www.oracle.com if you need additional information or have any
jtulach@144
    23
 * questions.
jtulach@144
    24
 */
jtulach@144
    25
jtulach@144
    26
jtulach@167
    27
package org.apidesign.javap;
jtulach@144
    28
jtulach@144
    29
import java.io.*;
jtulach@144
    30
jtulach@144
    31
/**
jtulach@144
    32
 * Strores field data informastion.
jtulach@144
    33
 *
jtulach@144
    34
 * @author  Sucheta Dambalkar (Adopted code from jdis)
jtulach@144
    35
 */
jtulach@144
    36
jtulach@144
    37
public class FieldData implements RuntimeConstants  {
jtulach@144
    38
jtulach@144
    39
    ClassData cls;
jtulach@144
    40
    int access;
jtulach@144
    41
    int name_index;
jtulach@144
    42
    int descriptor_index;
jtulach@144
    43
    int attributes_count;
jtulach@144
    44
    int value_cpx=0;
jtulach@144
    45
    boolean isSynthetic=false;
jtulach@144
    46
    boolean isDeprecated=false;
jtulach@144
    47
    Vector attrs;
jtulach@144
    48
jtulach@144
    49
    public FieldData(ClassData cls){
jtulach@144
    50
        this.cls=cls;
jtulach@144
    51
    }
jtulach@144
    52
jtulach@144
    53
    /**
jtulach@144
    54
     * Read and store field info.
jtulach@144
    55
     */
jtulach@144
    56
    public void read(DataInputStream in) throws IOException {
jtulach@144
    57
        access = in.readUnsignedShort();
jtulach@144
    58
        name_index = in.readUnsignedShort();
jtulach@144
    59
        descriptor_index = in.readUnsignedShort();
jtulach@144
    60
        // Read the attributes
jtulach@144
    61
        int attributes_count = in.readUnsignedShort();
jtulach@144
    62
        attrs=new Vector(attributes_count);
jtulach@144
    63
        for (int i = 0; i < attributes_count; i++) {
jtulach@144
    64
            int attr_name_index=in.readUnsignedShort();
jtulach@144
    65
            if (cls.getTag(attr_name_index)!=CONSTANT_UTF8) continue;
jtulach@144
    66
            String attr_name=cls.getString(attr_name_index);
jtulach@144
    67
            if (attr_name.equals("ConstantValue")){
jtulach@144
    68
                if (in.readInt()!=2)
jtulach@144
    69
                    throw new ClassFormatError("invalid ConstantValue attr length");
jtulach@144
    70
                value_cpx=in.readUnsignedShort();
jtulach@144
    71
                AttrData attr=new AttrData(cls);
jtulach@144
    72
                attr.read(attr_name_index);
jtulach@144
    73
                attrs.addElement(attr);
jtulach@144
    74
            } else if (attr_name.equals("Synthetic")){
jtulach@144
    75
                if (in.readInt()!=0)
jtulach@144
    76
                    throw new ClassFormatError("invalid Synthetic attr length");
jtulach@144
    77
                isSynthetic=true;
jtulach@144
    78
                AttrData attr=new AttrData(cls);
jtulach@144
    79
                attr.read(attr_name_index);
jtulach@144
    80
                attrs.addElement(attr);
jtulach@144
    81
            } else if (attr_name.equals("Deprecated")){
jtulach@144
    82
                if (in.readInt()!=0)
jtulach@144
    83
                    throw new ClassFormatError("invalid Synthetic attr length");
jtulach@144
    84
                isDeprecated = true;
jtulach@144
    85
                AttrData attr=new AttrData(cls);
jtulach@144
    86
                attr.read(attr_name_index);
jtulach@144
    87
                attrs.addElement(attr);
jtulach@144
    88
            } else {
jtulach@144
    89
                AttrData attr=new AttrData(cls);
jtulach@144
    90
                attr.read(attr_name_index, in);
jtulach@144
    91
                attrs.addElement(attr);
jtulach@144
    92
            }
jtulach@144
    93
        }
jtulach@144
    94
jtulach@144
    95
    }  // end read
jtulach@144
    96
jaroslav@151
    97
    public boolean isStatic() {
jaroslav@151
    98
        return (access & ACC_STATIC) != 0;
jaroslav@151
    99
    }
jaroslav@151
   100
    
jtulach@144
   101
    /**
jtulach@144
   102
     * Returns access of a field.
jtulach@144
   103
     */
jtulach@144
   104
    public String[] getAccess(){
jtulach@144
   105
        Vector v = new Vector();
jtulach@144
   106
        if ((access & ACC_PUBLIC)   !=0) v.addElement("public");
jtulach@144
   107
        if ((access & ACC_PRIVATE)   !=0) v.addElement("private");
jtulach@144
   108
        if ((access & ACC_PROTECTED)   !=0) v.addElement("protected");
jtulach@144
   109
        if ((access & ACC_STATIC)   !=0) v.addElement("static");
jtulach@144
   110
        if ((access & ACC_FINAL)    !=0) v.addElement("final");
jtulach@144
   111
        if ((access & ACC_VOLATILE) !=0) v.addElement("volatile");
jtulach@144
   112
        if ((access & ACC_TRANSIENT) !=0) v.addElement("transient");
jtulach@144
   113
        String[] accflags = new String[v.size()];
jtulach@144
   114
        v.copyInto(accflags);
jtulach@144
   115
        return accflags;
jtulach@144
   116
    }
jtulach@144
   117
jtulach@144
   118
    /**
jtulach@144
   119
     * Returns name of a field.
jtulach@144
   120
     */
jtulach@144
   121
    public String getName(){
jtulach@144
   122
        return cls.getStringValue(name_index);
jtulach@144
   123
    }
jtulach@144
   124
jtulach@144
   125
    /**
jtulach@144
   126
     * Returns internal signature of a field
jtulach@144
   127
     */
jtulach@144
   128
    public String getInternalSig(){
jtulach@144
   129
        return cls.getStringValue(descriptor_index);
jtulach@144
   130
    }
jtulach@144
   131
jtulach@144
   132
    /**
jtulach@144
   133
     * Returns true if field is synthetic.
jtulach@144
   134
     */
jtulach@144
   135
    public boolean isSynthetic(){
jtulach@144
   136
        return isSynthetic;
jtulach@144
   137
    }
jtulach@144
   138
jtulach@144
   139
    /**
jtulach@144
   140
     * Returns true if field is deprecated.
jtulach@144
   141
     */
jtulach@144
   142
    public boolean isDeprecated(){
jtulach@144
   143
        return isDeprecated;
jtulach@144
   144
    }
jtulach@144
   145
jtulach@144
   146
    /**
jtulach@144
   147
     * Returns index of constant value in cpool.
jtulach@144
   148
     */
jtulach@144
   149
    public int getConstantValueIndex(){
jtulach@144
   150
        return (value_cpx);
jtulach@144
   151
    }
jtulach@144
   152
jtulach@144
   153
    /**
jtulach@144
   154
     * Returns list of attributes of field.
jtulach@144
   155
     */
jtulach@144
   156
    public Vector getAttributes(){
jtulach@144
   157
        return attrs;
jtulach@144
   158
    }
jaroslav@240
   159
jaroslav@240
   160
    public byte[] findAnnotationData(boolean classRetention) {
jaroslav@240
   161
        String n = classRetention ?
jaroslav@240
   162
            "RuntimeInvisibleAnnotations" : // NOI18N
jaroslav@240
   163
            "RuntimeVisibleAnnotations"; // NOI18N
jaroslav@240
   164
        AttrData[] arr = new AttrData[attrs.size()];
jaroslav@240
   165
        attrs.copyInto(arr);
jaroslav@240
   166
        return ClassData.findAttr(n, arr);
jaroslav@240
   167
    }
jtulach@144
   168
}