corda/classpath/java/lang/reflect/Method.java

81 lines
2.0 KiB
Java
Raw Normal View History

package java.lang.reflect;
2007-07-21 20:44:39 +00:00
public class Method<T> extends AccessibleObject implements Member {
private byte vmFlags;
private byte parameterCount;
private short parameterFootprint;
private short flags;
private short offset;
private byte[] name;
private byte[] spec;
private Class<T> class_;
private Object code;
private Method() { }
public boolean isAccessible() {
return (vmFlags & Accessible) != 0;
}
public void setAccessible(boolean v) {
if (v) vmFlags |= Accessible; else vmFlags &= ~Accessible;
}
2007-07-21 20:44:39 +00:00
public Class<T> getDeclaringClass() {
return class_;
}
public int getModifiers() {
return flags;
}
public String getName() {
return new String(name, 0, name.length - 1, false);
}
2007-07-24 01:44:20 +00:00
private static int next(char c, String s, int start) {
for (int i = start; i < s.length(); ++i) {
if (s.charAt(i) == c) return i;
}
throw new RuntimeException();
}
public Class[] getParameterTypes() {
int count = parameterCount;
if ((flags & Modifier.STATIC) == 0) {
-- count;
}
Class[] types = new Class[count];
int index = 0;
String spec = new String(this.spec, 1, this.spec.length - 1, false);
for (int i = 0; i < spec.length(); ++i) {
char c = spec.charAt(i);
if (c == 'L') {
String name = spec.substring(i + 1, next(';', spec, i + 1));
types[index++] = Class.forName(name);
} else if (c == '[') {
int start = i;
while (spec.charAt(i) == '[') ++i;
if (spec.charAt(i) == 'L') {
String name = spec.substring(start, next(';', spec, i + 1));
types[index++] = Class.forName(name);
} else {
String name = spec.substring(start, i + 1);
types[index++] = Class.forName(name);
}
} else {
String name = spec.substring(i, i + 1);
types[index++] = Class.forName(name);
}
}
return types;
}
public native Object invoke(Object instance, Object ... arguments);
}