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 package javassist.bytecode.annotation;
16 
17 import javassist.ClassPool;
18 import javassist.bytecode.ConstPool;
19 import java.io.IOException;
20 import java.lang.reflect.Method;
21 
22 /**
23  * Nested annotation.
24  *
25  * @author <a href="mailto:bill@jboss.org">Bill Burke</a>
26  * @author Shigeru Chiba
27  */
28 public class AnnotationMemberValue extends MemberValue {
29     Annotation value;
30 
31     /**
32      * Constructs an annotation member.  The initial value is not specified.
33      */
AnnotationMemberValue(ConstPool cp)34     public AnnotationMemberValue(ConstPool cp) {
35         this(null, cp);
36     }
37 
38     /**
39      * Constructs an annotation member.  The initial value is specified by
40      * the first parameter.
41      */
AnnotationMemberValue(Annotation a, ConstPool cp)42     public AnnotationMemberValue(Annotation a, ConstPool cp) {
43         super('@', cp);
44         value = a;
45     }
46 
getValue(ClassLoader cl, ClassPool cp, Method m)47     Object getValue(ClassLoader cl, ClassPool cp, Method m)
48         throws ClassNotFoundException
49     {
50         return AnnotationImpl.make(cl, getType(cl), cp, value);
51     }
52 
getType(ClassLoader cl)53     Class getType(ClassLoader cl) throws ClassNotFoundException {
54         if (value == null)
55             throw new ClassNotFoundException("no type specified");
56         else
57             return loadClass(cl, value.getTypeName());
58     }
59 
60     /**
61      * Obtains the value.
62      */
getValue()63     public Annotation getValue() {
64         return value;
65     }
66 
67     /**
68      * Sets the value of this member.
69      */
setValue(Annotation newValue)70     public void setValue(Annotation newValue) {
71         value = newValue;
72     }
73 
74     /**
75      * Obtains the string representation of this object.
76      */
toString()77     public String toString() {
78         return value.toString();
79     }
80 
81     /**
82      * Writes the value.
83      */
write(AnnotationsWriter writer)84     public void write(AnnotationsWriter writer) throws IOException {
85         writer.annotationValue();
86         value.write(writer);
87     }
88 
89     /**
90      * Accepts a visitor.
91      */
accept(MemberValueVisitor visitor)92     public void accept(MemberValueVisitor visitor) {
93         visitor.visitAnnotationMemberValue(this);
94     }
95 }
96