
com.undefinedlabs.scope.agent.ScopeClassLoaderMatcher Maven / Gradle / Ivy
package com.undefinedlabs.scope.agent;
import java.util.Map;
import java.util.WeakHashMap;
import net.bytebuddy.matcher.ElementMatcher;
public class ScopeClassLoaderMatcher {
public static final ClassLoader BOOTSTRAP_CLASSLOADER = null;
public static ElementMatcher.Junction.AbstractBase skipClassLoader() {
return SkipClassLoaderMatcher.INSTANCE;
}
public static ElementMatcher.Junction.AbstractBase hasClassesNamed(
final String... classNames) {
return new ClassLoaderHasClassesNamedMatcher(classNames);
}
private static final class SkipClassLoaderMatcher
extends ElementMatcher.Junction.AbstractBase {
public static final SkipClassLoaderMatcher INSTANCE = new SkipClassLoaderMatcher();
@Override
public boolean matches(final ClassLoader loader) {
if (loader == BOOTSTRAP_CLASSLOADER) {
return false;
}
switch (loader.getClass().getName()) {
case "sun.reflect.DelegatingClassLoader":
case "jdk.internal.reflect.DelegatingClassLoader":
case "sun.misc.Launcher$ExtClassLoader":
return true;
}
return false;
}
}
private static final class ClassLoaderHasClassesNamedMatcher
extends ElementMatcher.Junction.AbstractBase {
private final String[] resources;
private final Map cache = new WeakHashMap<>(25);
private ClassLoaderHasClassesNamedMatcher(final String... classNames) {
resources = classNames;
for (int i = 0; i < resources.length; i++) {
resources[i] = resources[i].replace(".", "/") + ".class";
}
}
private boolean hasResources(final ClassLoader cl) {
for (final String resource : resources) {
if (cl.getResource(resource) == null) {
return false;
}
}
return true;
}
@Override
public boolean matches(final ClassLoader cl) {
if (cl == BOOTSTRAP_CLASSLOADER) {
// Can't match the bootstrap classloader.
return false;
}
final Boolean cached;
if ((cached = cache.get(cl)) != null) {
return cached;
}
final boolean hasResources = hasResources(cl);
cache.put(cl, hasResources);
return hasResources;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy