fork download
  1. import java.lang.reflect.Field;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import java.util.regex.Pattern;
  6.  
  7.  
  8. class ReflectedObject {
  9. private final Object object;
  10. public final Class<?> clazz;
  11. public final Class<?> ancestorClass;
  12.  
  13. private ReflectedObject(Object o, Class<?> ancestorClass) {
  14. if (o == null || ancestorClass == null) {
  15. throw new IllegalArgumentException("non-null object expected");
  16. }
  17.  
  18. if (!ancestorClass.isAssignableFrom(o.getClass())) {
  19. throw new IllegalArgumentException("ancestor class expected");
  20. }
  21.  
  22. this.object = o;
  23. this.clazz = o.getClass();
  24. this.ancestorClass = ancestorClass;
  25. }
  26.  
  27. public static ReflectedObject wrap(Object o) {
  28. return new ReflectedObject(o, o.getClass());
  29. }
  30.  
  31. public static ReflectedObject wrap(Object o, String ancestorClass) {
  32. return new ReflectedObject(o, ReflectionUtils.getClass(ancestorClass));
  33. }
  34.  
  35. public static ReflectedObject wrap(Object o, Class<?> ancestorClass) {
  36. return new ReflectedObject(o, ancestorClass);
  37. }
  38.  
  39. public Field[] getDeclaredFields() {
  40. List<Field> f = new ArrayList<Field>();
  41. Class<?> current = clazz;
  42. while (true) {
  43. f.addAll(Arrays.asList(current.getDeclaredFields()));
  44.  
  45. if (current != ancestorClass) {
  46. current = current.getSuperclass();
  47. } else {
  48. break;
  49. }
  50. }
  51.  
  52. return f.toArray(new Field[f.size()]);
  53. }
  54.  
  55. public Field getField(String name) {
  56. Field f = null;
  57. Class<?> current = clazz;
  58. while (true) {
  59. try {
  60. f = current.getDeclaredField(name);
  61. break;
  62. } catch (NoSuchFieldException e) {
  63. if (current != ancestorClass) {
  64. current = current.getSuperclass();
  65. } else {
  66. break;
  67. }
  68. }
  69. }
  70.  
  71. return f;
  72. }
  73.  
  74. public Object get(String fieldName) {
  75. Field f = getField(fieldName);
  76.  
  77. if (f == null) {
  78. throw new IllegalArgumentException("Field not found");
  79. }
  80.  
  81. f.setAccessible(true);
  82.  
  83. try {
  84. return f.get(object);
  85. } catch (IllegalAccessException e) {
  86. throw new InternalError();
  87. }
  88. }
  89.  
  90. public int getInt(String fieldName) {
  91. Field f = getField(fieldName);
  92.  
  93. if (f == null) {
  94. throw new IllegalArgumentException("Field not found");
  95. }
  96.  
  97. f.setAccessible(true);
  98.  
  99. try {
  100. return f.getInt(object);
  101. } catch (IllegalAccessException e) {
  102. throw new InternalError();
  103. }
  104. }
  105.  
  106. public boolean getBoolean(String fieldName) {
  107. Field f = getField(fieldName);
  108.  
  109. if (f == null) {
  110. throw new IllegalArgumentException("Field not found");
  111. }
  112.  
  113. f.setAccessible(true);
  114.  
  115. try {
  116. return f.getBoolean(object);
  117. } catch (IllegalAccessException e) {
  118. throw new InternalError();
  119. }
  120. }
  121.  
  122. public boolean instanceOf(String className) {
  123. return ReflectionUtils.getClass(className).isAssignableFrom(clazz);
  124. }
  125.  
  126. public boolean instanceOf(Class<?> parentClass) {
  127. return parentClass.isAssignableFrom(clazz);
  128. }
  129.  
  130. /*
  131. public Class<?>[] getDeclaredClasses() {
  132. return object.getClass().getDeclaredClasses();
  133. }
  134. */
  135.  
  136. public static void main(String args[]) throws Exception {
  137. Pattern p = Pattern.compile("^a+[^\\dabc]xyz$");
  138. ReflectedObject _pattern = ReflectedObject.wrap(p);
  139.  
  140. // System.out.println(Arrays.toString(pattern.getDeclaredFields()));
  141. // System.out.println(Arrays.toString(pattern.clazz.getDeclaredClasses()));
  142.  
  143. Object lastAccept = _pattern.get("lastAccept");
  144.  
  145. System.out.println(_pattern.get("lastAccept"));
  146. System.out.println(_pattern.get("lookbehindEnd"));
  147.  
  148. System.out.println("---");
  149.  
  150. Object curr = _pattern.get("root");
  151.  
  152. while (curr != lastAccept) {
  153. ReflectedObject _curr = ReflectedObject.wrap(curr, "java.util.regex.Pattern$Node");
  154.  
  155. System.out.println(_curr.object);
  156. // System.out.println(Arrays.toString(_curr.getDeclaredFields()));
  157.  
  158. if (_curr.instanceOf("java.util.regex.Pattern$CharProperty")) {
  159. System.out.printf("lhs=%s, rhs=%s\n", _curr.get("val$lhs"), _curr.get("val$rhs"));
  160. } else if (_curr.instanceOf("java.util.regex.Pattern$Curly")) {
  161. System.out.printf("type=%d, cmin=%d, cmax=%d\n", _curr.get("type"), _curr.get("cmin"), _curr.get("cmax"));
  162. } else if (_curr.instanceOf("java.util.regex.Pattern$SliceNode")) {
  163. int[] buffer = (int[]) _curr.get("buffer");
  164. System.out.println(new String(buffer, 0, buffer.length));
  165. }
  166.  
  167. curr = _curr.get("next");
  168. }
  169. }
  170. }
  171.  
  172. class ReflectionUtils {
  173. public static Class<?> getClass(String name) {
  174. try {
  175. return Class.forName(name);
  176. } catch (ClassNotFoundException e) {
  177. throw new RuntimeException(e);
  178. }
  179. }
  180.  
  181. }
Success #stdin #stdout 0.1s 320320KB
stdin
Standard input is empty
stdout
java.util.regex.Pattern$LastNode@647e05
java.util.regex.Pattern$4@1909752
---
java.util.regex.Pattern$Begin@14eac69
java.util.regex.Pattern$Curly@1c7c054
type=0, cmin=1, cmax=2147483647
java.util.regex.Pattern$7@a298b7
lhs=java.util.regex.Pattern$7@d93b30, rhs=java.util.regex.Pattern$BitClass@16d3586
java.util.regex.Pattern$Slice@a14482
xyz
java.util.regex.Pattern$Dollar@14ae5a5