/*
* Copyright 2014 NAVER Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.navercorp.pinpoint.common.util;
/**
* @author emeroad
*/
public final class ClassLoaderUtils {
public static final ClassLoaderCallable DEFAULT_CLASS_LOADER_CALLABLE = new ClassLoaderCallable() {
@Override
public ClassLoader getClassLoader() {
return ClassLoaderUtils.class.getClassLoader();
}
};
private static final ClassLoader SYSTEM_CLASS_LOADER;
private static final ClassLoader EXT_CLASS_LOADER;
private static final ClassLoader BOOT_CLASS_LOADER;
static {
SYSTEM_CLASS_LOADER = ClassLoader.getSystemClassLoader();
if (SYSTEM_CLASS_LOADER != null) {
EXT_CLASS_LOADER = SYSTEM_CLASS_LOADER.getParent();
} else {
EXT_CLASS_LOADER = null;
}
if (EXT_CLASS_LOADER != null) {
BOOT_CLASS_LOADER = EXT_CLASS_LOADER.getParent();
} else {
BOOT_CLASS_LOADER = null;
}
}
private ClassLoaderUtils() {
}
// TODO check @CallerSensitive, Reflection.getCallerClass()
// private static ClassLoader getClassLoader(ClassLoader classLoader) {
// if (classLoader == null) {
// return ClassLoader.getSystemClassLoader();
// }
// return classLoader;
// }
public static ClassLoader getDefaultClassLoader() {
return getDefaultClassLoader(DEFAULT_CLASS_LOADER_CALLABLE);
}
public static ClassLoader getDefaultClassLoader(ClassLoaderCallable defaultClassLoaderCallable) {
if (defaultClassLoaderCallable == null) {
throw new NullPointerException("defaultClassLoaderCallable must not be null");
}
try {
final Thread th = Thread.currentThread();
final ClassLoader contextClassLoader = th.getContextClassLoader();
if (contextClassLoader != null) {
return contextClassLoader;
}
} catch (Throwable ignore) {
// skip
}
// Timing for security exceptions is different when the ClassLoader is received as an argument
return defaultClassLoaderCallable.getClassLoader();
}
public interface ClassLoaderCallable {
ClassLoader getClassLoader();
}
public static boolean isJvmClassLoader(ClassLoader classLoader) {
if (BOOT_CLASS_LOADER == classLoader || SYSTEM_CLASS_LOADER == classLoader || EXT_CLASS_LOADER == classLoader) {
return true;
}
return false;
}
public static String dumpStandardClassLoader() {
final StringBuilder buffer = new StringBuilder();
appendClassLoaderLog(buffer, "SYSTEM_CLASS_LOADER", SYSTEM_CLASS_LOADER);
appendClassLoaderLog(buffer, "EXT_CLASS_LOADER", EXT_CLASS_LOADER);
appendClassLoaderLog(buffer, "BOOT_CLASS_LOADER", BOOT_CLASS_LOADER);
return buffer.toString();
}
private static void appendClassLoaderLog(StringBuilder buffer, String classLoaderName, ClassLoader classLoader) {
buffer.append(classLoaderName);
buffer.append(':');
if (classLoader == null) {
buffer.append("null");
} else {
buffer.append(classLoader.toString());
}
buffer.append(", ");
}
}