diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java b/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java index 655ad624b9c9..450a09dd2eaa 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java @@ -19,9 +19,6 @@ package org.eclipse.jetty.util; import java.io.IOException; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -43,8 +40,6 @@ import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; -import static java.lang.invoke.MethodType.methodType; - /** * TYPE Utilities. * Provides various static utility methods for manipulating types and their @@ -178,44 +173,32 @@ public class TypeUtil } } - private static final MethodHandle[] LOCATION_METHODS; + private static final List, URI>> LOCATION_METHODS = new ArrayList<>(); private static final Function, URI> MODULE_LOCATION; static { - List locationMethods = new ArrayList<>(); - - MethodHandles.Lookup lookup = MethodHandles.lookup(); - MethodType type = methodType(URI.class, Class.class); - + // Lookup order in LOCATION_METHOD is important. + LOCATION_METHODS.add(TypeUtil::getCodeSourceLocation); + Function, URI> moduleFunc = null; try { - locationMethods.add(lookup.findStatic(TypeUtil.class, "getCodeSourceLocation", type)); - Function, URI> moduleFunc = null; - try - { - Class clazzModuleLocation = Class.forName(TypeUtil.class.getPackage().getName() + ".ModuleLocation"); - Object obj = clazzModuleLocation.getConstructor().newInstance(); - if (obj instanceof Function) - { - //noinspection unchecked - moduleFunc = (Function, URI>)obj; - locationMethods.add(lookup.findStatic(TypeUtil.class, "getModuleLocation", type)); - } - } - catch (Throwable t) + Class clazzModuleLocation = Class.forName(TypeUtil.class.getPackage().getName() + ".ModuleLocation"); + Object obj = clazzModuleLocation.getConstructor().newInstance(); + if (obj instanceof Function) { - LOG.debug("This JVM Runtime does not support Modules, disabling Jetty internal support"); + //noinspection unchecked + moduleFunc = (Function, URI>)obj; + LOCATION_METHODS.add(moduleFunc); } - MODULE_LOCATION = moduleFunc; - locationMethods.add(lookup.findStatic(TypeUtil.class, "getClassLoaderLocation", type)); - locationMethods.add(lookup.findStatic(TypeUtil.class, "getSystemClassLoaderLocation", type)); - LOCATION_METHODS = locationMethods.toArray(new MethodHandle[0]); } - catch (Exception e) + catch (Throwable t) { - throw new RuntimeException("Unable to establish Location Lookup Handles", e); + LOG.debug("This JVM Runtime does not support Modules, disabling Jetty internal support"); } + MODULE_LOCATION = moduleFunc; + LOCATION_METHODS.add(TypeUtil::getClassLoaderLocation); + LOCATION_METHODS.add(TypeUtil::getSystemClassLoaderLocation); } /** @@ -634,13 +617,11 @@ public static boolean isFalse(Object o) */ public static URI getLocationOfClass(Class clazz) { - URI location; - - for (MethodHandle locationMethod : LOCATION_METHODS) + for (Function, URI> locationFunction : LOCATION_METHODS) { try { - location = (URI)locationMethod.invoke(clazz); + URI location = locationFunction.apply(clazz); if (location != null) { return location;