/*
 * Copyright 2002-2017 the original author or authors.
 *
 * 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
 *
 *      https://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 org.springframework.core;

import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

Base class for decorating ClassLoaders such as OverridingClassLoader and ShadowingClassLoader, providing common handling of excluded packages and classes.
Author:Juergen Hoeller, Rod Johnson
Since:2.5.2
/** * Base class for decorating ClassLoaders such as {@link OverridingClassLoader} * and {@link org.springframework.instrument.classloading.ShadowingClassLoader}, * providing common handling of excluded packages and classes. * * @author Juergen Hoeller * @author Rod Johnson * @since 2.5.2 */
public abstract class DecoratingClassLoader extends ClassLoader { static { ClassLoader.registerAsParallelCapable(); } private final Set<String> excludedPackages = Collections.newSetFromMap(new ConcurrentHashMap<>(8)); private final Set<String> excludedClasses = Collections.newSetFromMap(new ConcurrentHashMap<>(8));
Create a new DecoratingClassLoader with no parent ClassLoader.
/** * Create a new DecoratingClassLoader with no parent ClassLoader. */
public DecoratingClassLoader() { }
Create a new DecoratingClassLoader using the given parent ClassLoader for delegation.
/** * Create a new DecoratingClassLoader using the given parent ClassLoader * for delegation. */
public DecoratingClassLoader(@Nullable ClassLoader parent) { super(parent); }
Add a package name to exclude from decoration (e.g. overriding).

Any class whose fully-qualified name starts with the name registered here will be handled by the parent ClassLoader in the usual fashion.

Params:
  • packageName – the package name to exclude
/** * Add a package name to exclude from decoration (e.g. overriding). * <p>Any class whose fully-qualified name starts with the name registered * here will be handled by the parent ClassLoader in the usual fashion. * @param packageName the package name to exclude */
public void excludePackage(String packageName) { Assert.notNull(packageName, "Package name must not be null"); this.excludedPackages.add(packageName); }
Add a class name to exclude from decoration (e.g. overriding).

Any class name registered here will be handled by the parent ClassLoader in the usual fashion.

Params:
  • className – the class name to exclude
/** * Add a class name to exclude from decoration (e.g. overriding). * <p>Any class name registered here will be handled by the parent * ClassLoader in the usual fashion. * @param className the class name to exclude */
public void excludeClass(String className) { Assert.notNull(className, "Class name must not be null"); this.excludedClasses.add(className); }
Determine whether the specified class is excluded from decoration by this class loader.

The default implementation checks against excluded packages and classes.

Params:
  • className – the class name to check
See Also:
Returns:whether the specified class is eligible
/** * Determine whether the specified class is excluded from decoration * by this class loader. * <p>The default implementation checks against excluded packages and classes. * @param className the class name to check * @return whether the specified class is eligible * @see #excludePackage * @see #excludeClass */
protected boolean isExcluded(String className) { if (this.excludedClasses.contains(className)) { return true; } for (String packageName : this.excludedPackages) { if (className.startsWith(packageName)) { return true; } } return false; } }