169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/* 269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Javassist, a Java-bytecode translator toolkit. 369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Copyright (C) 2004 Bill Burke. All Rights Reserved. 469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The contents of this file are subject to the Mozilla Public License Version 669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1.1 (the "License"); you may not use this file except in compliance with 769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the License. Alternatively, the contents of this file may be used under 869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the terms of the GNU Lesser General Public License Version 2.1 or later. 969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Software distributed under the License is distributed on an "AS IS" basis, 1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * for the specific language governing rights and limitations under the 1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * License. 1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage javassist.bytecode.annotation; 1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.ClassPool; 1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.ConstPool; 2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.Descriptor; 2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.IOException; 2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.lang.reflect.Array; 2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.lang.reflect.Method; 2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/** 2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The value of a member declared in an annotation. 2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @see Annotation#getMemberValue(String) 3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @author <a href="mailto:bill@jboss.org">Bill Burke</a> 3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @author Shigeru Chiba 3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpublic abstract class MemberValue { 3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ConstPool cp; 3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal char tag; 3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal MemberValue(char tag, ConstPool cp) { 3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal this.cp = cp; 3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal this.tag = tag; 4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Returns the value. If the value type is a primitive type, the 4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * returned value is boxed. 4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal abstract Object getValue(ClassLoader cl, ClassPool cp, Method m) 4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws ClassNotFoundException; 4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal abstract Class getType(ClassLoader cl) throws ClassNotFoundException; 5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal static Class loadClass(ClassLoader cl, String classname) 5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws ClassNotFoundException, NoSuchClassError 5369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 5469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 5569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return Class.forName(convertFromArray(classname), true, cl); 5669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 5769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (LinkageError e) { 5869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new NoSuchClassError(classname, e); 5969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 6069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 6169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 6269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private static String convertFromArray(String classname) 6369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 6469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int index = classname.indexOf("[]"); 6569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (index != -1) { 6669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String rawType = classname.substring(0, index); 6769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal StringBuffer sb = new StringBuffer(Descriptor.of(rawType)); 6869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (index != -1) { 6969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal sb.insert(0, "["); 7069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal index = classname.indexOf("[]", index + 1); 7169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 7269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return sb.toString().replace('/', '.'); 7369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 7469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return classname; 7569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 7669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 7869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Accepts a visitor. 7969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 8069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public abstract void accept(MemberValueVisitor visitor); 8169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 8269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 8369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Writes the value. 8469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 8569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public abstract void write(AnnotationsWriter w) throws IOException; 8669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal} 8769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 8869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 89