1 cananian 1.1.4.1 // HClassArray.java, created Wed Dec 29 22:24:55 1999 by cananian 2 cananian 1.1.4.1 // Copyright (C) 1999 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.4.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.4.1 package harpoon.ClassFile; 5 cananian 1.1.4.1 6 cananian 1.3 import java.lang.reflect.Modifier; 7 cananian 1.1.4.1 8 cananian 1.3 import net.cscott.jutil.Util; 9 cananian 1.1.4.1 /** 10 cananian 1.1.4.1 * <code>HClassArray</code> is a simple <code>HClass</code> implementation 11 cananian 1.1.4.1 * representing array types. 12 cananian 1.1.4.1 * 13 cananian 1.1.4.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 14 cananian 1.3 * @version $Id: HClassArray.java,v 1.3 2004/02/08 01:58:03 cananian Exp $ 15 cananian 1.1.4.1 */ 16 cananian 1.1.4.1 class HClassArray extends HClassImpl { 17 cananian 1.1.4.1 HClass baseType; 18 cananian 1.1.4.1 int dims; 19 cananian 1.1.4.1 HField lengthField; 20 cananian 1.1.4.1 HMethod cloneMethod; 21 cananian 1.1.4.1 22 cananian 1.1.4.1 HClassArray(Linker linker, HClass baseType, int dims) { 23 cananian 1.1.4.1 super(linker); 24 cananian 1.1.4.1 this.baseType = baseType; this.dims = dims; 25 cananian 1.1.4.1 this.lengthField = new HArrayField(this, "length", HClass.Int, 26 cananian 1.1.4.1 Modifier.PUBLIC | Modifier.FINAL); 27 cananian 1.1.4.1 this.cloneMethod = new HArrayMethod(this, "clone", 28 cananian 1.1.4.1 Modifier.PUBLIC | Modifier.NATIVE, 29 cananian 1.1.4.4 linker.forName("java.lang.Object"), 30 cananian 1.1.4.4 new HClass[0], new String[0], 31 cananian 1.1.4.1 new HClass[0], false); 32 cananian 1.1.4.1 } 33 cananian 1.1.4.1 public HClass getComponentType() { 34 cananian 1.1.4.1 return getLinker().forDescriptor(getDescriptor().substring(1)); 35 cananian 1.1.4.1 } 36 cananian 1.1.4.1 public String getName() { 37 cananian 1.1.4.1 // handle arrays. 38 cananian 1.1.4.1 return getDescriptor(); // this is how sun's implementation works. 39 cananian 1.1.4.1 } 40 cananian 1.1.4.1 public String getDescriptor() { 41 cananian 1.1.4.1 return Util.repeatString("[", dims) + baseType.getDescriptor(); 42 cananian 1.1.4.1 } 43 cananian 1.1.4.1 public HField [] getDeclaredFields () { 44 cananian 1.1.4.1 return new HField[] { lengthField }; 45 cananian 1.1.4.1 } 46 cananian 1.1.4.1 public HMethod[] getDeclaredMethods() { 47 cananian 1.1.4.1 return new HMethod[] { cloneMethod }; 48 cananian 1.1.4.1 } 49 cananian 1.1.4.3 public int getModifiers() { 50 cananian 1.1.4.3 // this is what java.lang.Class returns. 51 cananian 1.1.4.3 return Modifier.PUBLIC | Modifier.ABSTRACT | Modifier.FINAL; 52 cananian 1.1.4.3 } 53 cananian 1.1.4.4 public HClass getSuperclass() { 54 cananian 1.1.4.4 return getLinker().forName("java.lang.Object"); 55 cananian 1.1.4.4 } 56 cananian 1.1.4.1 public HClass[] getInterfaces() { 57 cananian 1.1.4.1 // see http://java.sun.com/docs/books/jls/clarify.html 58 cananian 1.1.4.4 return new HClass[] { 59 cananian 1.1.4.4 getLinker().forName("java.lang.Cloneable"), 60 cananian 1.1.4.4 getLinker().forName("java.io.Serializable"), 61 cananian 1.1.4.4 }; 62 cananian 1.1.4.1 } 63 cananian 1.1.4.1 public boolean isArray() { return true; } 64 cananian 1.1.4.1 } 65 cananian 1.1.4.1 66 cananian 1.1.4.1 // set emacs indentation style. 67 cananian 1.1.4.1 // Local Variables: 68 cananian 1.1.4.1 // c-basic-offset:2 69 cananian 1.2 // End: