+ public Field field(String name, Type type) { return new Field(name, type); }
+ public Field field(String name, String descriptor) { return field(name,Type.fromDescriptor(descriptor)); }
+
+ public Method method(String name, Type returnType, Type[] argTypes) { return new Method(name, returnType, argTypes); }
+
+ /** see JVM Spec section 2.10.2 */
+ public Method method(String name, String descriptor) {
+ // FEATURE: This parser is ugly but it works (and shouldn't be a problem) might want to clean it up though
+ String s = descriptor;
+ if(!s.startsWith("(")) throw new IllegalArgumentException("invalid method type descriptor");
+ int p = s.indexOf(')');
+ if(p == -1) throw new IllegalArgumentException("invalid method type descriptor");
+ String argsDesc = s.substring(1,p);
+ String retDesc = s.substring(p+1);
+ Type[] argsBuf = new Type[argsDesc.length()];
+ int i;
+ for(i=0,p=0;argsDesc.length() > 0;i++,p=0) {
+ while(p < argsDesc.length() && argsDesc.charAt(p) == '[') p++;
+ if(p == argsDesc.length()) throw new IllegalArgumentException("invalid method type descriptor");
+ if(argsDesc.charAt(p) == 'L') {
+ p = argsDesc.indexOf(';');
+ if(p == -1) throw new IllegalArgumentException("invalid method type descriptor");
+ }
+ argsBuf[i] = Type.fromDescriptor(argsDesc.substring(0,p+1));
+ argsDesc = argsDesc.substring(p+1);
+ }
+ Type args[] = new Type[i];
+ System.arraycopy(argsBuf,0,args,0,i);
+ return method(name, Type.fromDescriptor(retDesc), args);
+ }
+
+ public abstract class Member {
+ public final String name;
+ private Member(String name) { this.name = name; }
+ public Type.Class getDeclaringClass() { return Type.Class.this; }
+ public String getName() { return name; }
+ public abstract String getTypeDescriptor();
+ public abstract String toString();
+ }
+
+ public class Field extends Member {
+ public final Type type;
+ private Field(String name, Type t) { super(name); this.type = t; }
+ public String getTypeDescriptor() { return type.getDescriptor(); }
+ public Type getType() { return type; }
+ public String toString() { return getDeclaringClass().toString()+"."+name+"["+type.toString()+"]"; }
+ public class Body extends HasAttributes {
+ public Field getField() { return Field.this; }
+ public Body(int flags, ClassFile.AttrGen attrs) {
+ super(flags, attrs);
+ if ((flags & ~VALID_FIELD_FLAGS) != 0) throw new IllegalArgumentException("invalid flags");
+ }
+ }