Converter's DTOUtil is overly reliant on exceptions for normal execution flow
DTOUtil.isDTOType() [1] relies on exceptions to find out whether a class has a public constructor and to find out if it has any methods - as a DTO should have a public no-args constructor and no methods beyond the ones defined by Object.class. 

This works but is wasteful and slow. We should implement a different strategy to identify a DTO class as such.

[1] https://github.com/osgi/osgi/blob/main/org.osgi.util.converter/src/org/osgi/util/converter/DTOUtil.java
diff --git a/org.osgi.util.converter/src/org/osgi/util/converter/DTOUtil.java b/org.osgi.util.converter/src/org/osgi/util/converter/DTOUtil.java
index 08023923fa..8f4df68dfe 100644
--- a/org.osgi.util.converter/src/org/osgi/util/converter/DTOUtil.java
+++ b/org.osgi.util.converter/src/org/osgi/util/converter/DTOUtil.java
@@ -18,45 +18,43 @@
 
 package org.osgi.util.converter;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.Arrays;
 
 /**
  * @author $Id$
  */
 class DTOUtil {
+	private static final Method[] OBJECT_CLASS_METHODS = Object.class
+			.getMethods();
+
 	private DTOUtil() {
 		// Do not instantiate. This is a utility class.
 	}
 
 	static boolean isDTOType(Class< ? > cls, boolean ignorePublicNoArgsCtor) {
 		if (!ignorePublicNoArgsCtor) {
-			try {
-				cls.getConstructor();
-			} catch (NoSuchMethodException | SecurityException e) {
+			if (Arrays.stream(cls.getConstructors())
+					.noneMatch(ctor -> ctor.getParameterCount() == 0)) {
 				// No public zero-arg constructor, not a DTO
 				return false;
 			}
 		}
 
 		for (Method m : cls.getMethods()) {
-			try {
-				Object.class.getMethod(m.getName(), m.getParameterTypes());
-			} catch (NoSuchMethodException snme) {
+			if (Arrays.stream(OBJECT_CLASS_METHODS)
+					.noneMatch(om -> om.getName().equals(m.getName())
+							&& Arrays.equals(om.getParameterTypes(),
+									m.getParameterTypes()))) {
 				// Not a method defined by Object.class (or override of such
 				// method)
 				return false;
 			}
 		}
 
-		/*
-		 * for (Field f : cls.getDeclaredFields()) { int modifiers =
-		 * f.getModifiers(); if (Modifier.isStatic(modifiers)) { // ignore
-		 * static fields continue; } if (!Modifier.isPublic(modifiers)) { return
-		 * false; } }
-		 */
-
 		boolean foundField = false;
 		for (Field f : cls.getFields()) {
 			int modifiers = f.getModifiers();
['org.osgi.util.converter/src/org/osgi/util/converter/DTOUtil.java']