Index: /trunk/src/org/openstreetmap/josm/tools/XmlObjectParser.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/XmlObjectParser.java	(revision 15709)
+++ /trunk/src/org/openstreetmap/josm/tools/XmlObjectParser.java	(revision 15710)
@@ -10,4 +10,5 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -81,6 +82,7 @@
         @Override
         public void startElement(String ns, String lname, String qname, Attributes a) throws SAXException {
-            if (mapping.containsKey(qname)) {
-                Class<?> klass = mapping.get(qname).klass;
+            final Entry entry = mapping.get(qname);
+            if (entry != null) {
+                Class<?> klass = entry.klass;
                 try {
                     current.push(klass.getConstructor().newInstance());
@@ -89,10 +91,10 @@
                 }
                 for (int i = 0; i < a.getLength(); ++i) {
-                    setValue(mapping.get(qname), a.getQName(i), a.getValue(i));
-                }
-                if (mapping.get(qname).onStart) {
+                    setValue(entry, a.getQName(i), a.getValue(i));
+                }
+                if (entry.onStart) {
                     report();
                 }
-                if (mapping.get(qname).both) {
+                if (entry.both) {
                     queue.add(current.peek());
                 }
@@ -102,8 +104,9 @@
         @Override
         public void endElement(String ns, String lname, String qname) throws SAXException {
-            if (mapping.containsKey(qname) && !mapping.get(qname).onStart) {
+            final Entry entry = mapping.get(qname);
+            if (entry != null && !entry.onStart) {
                 report();
-            } else if (mapping.containsKey(qname) && characters != null && !current.isEmpty()) {
-                setValue(mapping.get(qname), qname, characters.toString().trim());
+            } else if (entry != null && characters != null && !current.isEmpty()) {
+                setValue(entry, qname, characters.toString().trim());
                 characters = new StringBuilder(64);
             }
@@ -204,32 +207,15 @@
 
         Field getField(String s) {
-            if (fields.containsKey(s)) {
-                return fields.get(s);
-            } else {
-                try {
-                    Field f = klass.getField(s);
-                    fields.put(s, f);
-                    return f;
-                } catch (NoSuchFieldException ex) {
-                    Logging.trace(ex);
-                    fields.put(s, null);
-                    return null;
-                }
-            }
+            return fields.computeIfAbsent(s, ignore -> Arrays.stream(klass.getFields())
+                    .filter(f -> f.getName().equals(s))
+                    .findFirst()
+                    .orElse(null));
         }
 
         Method getMethod(String s) {
-            if (methods.containsKey(s)) {
-                return methods.get(s);
-            } else {
-                for (Method m : klass.getMethods()) {
-                    if (m.getName().equals(s) && m.getParameterTypes().length == 1) {
-                        methods.put(s, m);
-                        return m;
-                    }
-                }
-                methods.put(s, null);
-                return null;
-            }
+            return methods.computeIfAbsent(s, ignore -> Arrays.stream(klass.getMethods())
+                    .filter(m -> m.getName().equals(s) && m.getParameterTypes().length == 1)
+                    .findFirst()
+                    .orElse(null));
         }
     }
