import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
class ReflectedObject {
public final Class<?> clazz;
public final Class<?> ancestorClass;
private ReflectedObject
(Object o, Class
<?> ancestorClass
) { if (o == null || ancestorClass == null) {
}
if (!ancestorClass.isAssignableFrom(o.getClass())) {
}
this.object = o;
this.clazz = o.getClass();
this.ancestorClass = ancestorClass;
}
public static ReflectedObject wrap
(Object o
) { return new ReflectedObject(o, o.getClass());
}
public static ReflectedObject wrap
(Object o,
String ancestorClass
) { return new ReflectedObject(o, ReflectionUtils.getClass(ancestorClass));
}
public static ReflectedObject wrap
(Object o, Class
<?> ancestorClass
) { return new ReflectedObject(o, ancestorClass);
}
public Field[] getDeclaredFields
() { List<Field> f = new ArrayList<Field>();
Class<?> current = clazz;
while (true) {
f.
addAll(Arrays.
asList(current.
getDeclaredFields()));
if (current != ancestorClass) {
current = current.getSuperclass();
} else {
break;
}
}
return f.
toArray(new Field[f.
size()]); }
Class<?> current = clazz;
while (true) {
try {
f = current.getDeclaredField(name);
break;
if (current != ancestorClass) {
current = current.getSuperclass();
} else {
break;
}
}
}
return f;
}
Field f
= getField
(fieldName
);
if (f == null) {
}
f.setAccessible(true);
try {
return f.get(object);
}
}
public int getInt
(String fieldName
) { Field f
= getField
(fieldName
);
if (f == null) {
}
f.setAccessible(true);
try {
return f.getInt(object);
}
}
public boolean getBoolean
(String fieldName
) { Field f
= getField
(fieldName
);
if (f == null) {
}
f.setAccessible(true);
try {
return f.getBoolean(object);
}
}
public boolean instanceOf(String className
) { return ReflectionUtils.getClass(className).isAssignableFrom(clazz);
}
public boolean instanceOf(Class<?> parentClass) {
return parentClass.isAssignableFrom(clazz);
}
/*
public Class<?>[] getDeclaredClasses() {
return object.getClass().getDeclaredClasses();
}
*/
Pattern p = Pattern.compile("^a+[^\\dabc]xyz$");
ReflectedObject _pattern = ReflectedObject.wrap(p);
// System.out.println(Arrays.toString(pattern.getDeclaredFields()));
// System.out.println(Arrays.toString(pattern.clazz.getDeclaredClasses()));
Object lastAccept
= _pattern.
get("lastAccept");
System.
out.
println(_pattern.
get("lastAccept")); System.
out.
println(_pattern.
get("lookbehindEnd"));
Object curr
= _pattern.
get("root");
while (curr != lastAccept) {
ReflectedObject _curr = ReflectedObject.wrap(curr, "java.util.regex.Pattern$Node");
System.
out.
println(_curr.
object); // System.out.println(Arrays.toString(_curr.getDeclaredFields()));
if (_curr.instanceOf("java.util.regex.Pattern$CharProperty")) {
System.
out.
printf("lhs=%s, rhs=%s\n", _curr.
get("val$lhs"), _curr.
get("val$rhs")); } else if (_curr.instanceOf("java.util.regex.Pattern$Curly")) {
System.
out.
printf("type=%d, cmin=%d, cmax=%d\n", _curr.
get("type"), _curr.
get("cmin"), _curr.
get("cmax")); } else if (_curr.instanceOf("java.util.regex.Pattern$SliceNode")) {
int[] buffer = (int[]) _curr.get("buffer");
}
curr = _curr.get("next");
}
}
}
class ReflectionUtils {
public static Class
<?> getClass
(String name
) { try {
return Class.forName(name);
}
}
}