--- /dev/null
+/*
+ * Copyright (c) 2012, Takeyuki Nagao
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the
+ * following conditions are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ */
+
+package jp.sourceforge.dvibrowser.dvi2epub.reflect;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+
+public class MemberWalker {
+ private final MemberWalkerHandler handler;
+
+ public MemberWalker(MemberWalkerHandler handler) {
+ this.handler = handler;
+ if (handler == null) {
+ throw new NullPointerException("Handler can't be null.");
+ }
+ }
+
+ protected boolean wantMember(Object t, Member member)
+ throws MemberWalkerException {
+ return handler.wantMember(t, member);
+ }
+
+ public void walk(Object t) throws MemberWalkerException {
+ if (t == null)
+ throw new NullPointerException("Cannot walk about null object.");
+
+ if (t.getClass().isPrimitive())
+ return;
+
+ for (Class<?> cls = t.getClass();; cls = cls.getSuperclass()) {
+ for (Method method : cls.getDeclaredMethods()) {
+ if (!wantMember(t, method))
+ continue;
+ method.setAccessible(true);
+ handler.processMethod(t, method);
+ }
+ for (Field field : cls.getDeclaredFields()) {
+ if (!wantMember(t, field))
+ continue;
+ field.setAccessible(true);
+ handler.processField(t, field);
+ }
+ if (cls == Object.class)
+ break;
+ }
+ }
+}
\ No newline at end of file