Home | History | Annotate | Download | only in annotation
      1 /*
      2  * Javassist, a Java-bytecode translator toolkit.
      3  * Copyright (C) 2004 Bill Burke. All Rights Reserved.
      4  *
      5  * The contents of this file are subject to the Mozilla Public License Version
      6  * 1.1 (the "License"); you may not use this file except in compliance with
      7  * the License.  Alternatively, the contents of this file may be used under
      8  * the terms of the GNU Lesser General Public License Version 2.1 or later.
      9  *
     10  * Software distributed under the License is distributed on an "AS IS" basis,
     11  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
     12  * for the specific language governing rights and limitations under the
     13  * License.
     14  */
     15 
     16 package javassist.bytecode.annotation;
     17 
     18 import java.io.IOException;
     19 import java.lang.reflect.Method;
     20 
     21 import javassist.ClassPool;
     22 import javassist.bytecode.ConstPool;
     23 import javassist.bytecode.Descriptor;
     24 
     25 /**
     26  * Enum constant value.
     27  *
     28  * @author <a href="mailto:bill (at) jboss.org">Bill Burke</a>
     29  * @author Shigeru Chiba
     30  */
     31 public class EnumMemberValue extends MemberValue {
     32     int typeIndex, valueIndex;
     33 
     34     /**
     35      * Constructs an enum constant value.  The initial value is specified
     36      * by the constant pool entries at the given indexes.
     37      *
     38      * @param type      the index of a CONSTANT_Utf8_info structure
     39      *                  representing the enum type.
     40      * @param value     the index of a CONSTANT_Utf8_info structure.
     41      *                  representing the enum value.
     42      */
     43     public EnumMemberValue(int type, int value, ConstPool cp) {
     44         super('e', cp);
     45         this.typeIndex = type;
     46         this.valueIndex = value;
     47     }
     48 
     49     /**
     50      * Constructs an enum constant value.
     51      * The initial value is not specified.
     52      */
     53     public EnumMemberValue(ConstPool cp) {
     54         super('e', cp);
     55         typeIndex = valueIndex = 0;
     56     }
     57 
     58     Object getValue(ClassLoader cl, ClassPool cp, Method m)
     59         throws ClassNotFoundException
     60     {
     61         try {
     62             return getType(cl).getField(getValue()).get(null);
     63         }
     64         catch (NoSuchFieldException e) {
     65             throw new ClassNotFoundException(getType() + "." + getValue());
     66         }
     67         catch (IllegalAccessException e) {
     68             throw new ClassNotFoundException(getType() + "." + getValue());
     69         }
     70     }
     71 
     72     Class getType(ClassLoader cl) throws ClassNotFoundException {
     73         return loadClass(cl, getType());
     74     }
     75 
     76     /**
     77      * Obtains the enum type name.
     78      *
     79      * @return a fully-qualified type name.
     80      */
     81     public String getType() {
     82         return Descriptor.toClassName(cp.getUtf8Info(typeIndex));
     83     }
     84 
     85     /**
     86      * Changes the enum type name.
     87      *
     88      * @param typename a fully-qualified type name.
     89      */
     90     public void setType(String typename) {
     91         typeIndex = cp.addUtf8Info(Descriptor.of(typename));
     92     }
     93 
     94     /**
     95      * Obtains the name of the enum constant value.
     96      */
     97     public String getValue() {
     98         return cp.getUtf8Info(valueIndex);
     99     }
    100 
    101     /**
    102      * Changes the name of the enum constant value.
    103      */
    104     public void setValue(String name) {
    105         valueIndex = cp.addUtf8Info(name);
    106     }
    107 
    108     public String toString() {
    109         return getType() + "." + getValue();
    110     }
    111 
    112     /**
    113      * Writes the value.
    114      */
    115     public void write(AnnotationsWriter writer) throws IOException {
    116         writer.enumConstValue(cp.getUtf8Info(typeIndex), getValue());
    117     }
    118 
    119     /**
    120      * Accepts a visitor.
    121      */
    122     public void accept(MemberValueVisitor visitor) {
    123         visitor.visitEnumMemberValue(this);
    124     }
    125 }
    126