1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.tomcat;
import java.lang.instrument.ClassFileTransformer;
/**
* Specifies a class loader capable of being decorated with {@link ClassFileTransformer}s. These transformers can
* instrument (or weave) the byte code of classes loaded through this class loader to alter their behavior. Currently
* only {@link org.apache.catalina.loader.WebappClassLoaderBase} implements this interface. This allows web application
* frameworks or JPA providers bundled with a web application to instrument web application classes as necessary.
* <p>
* You should always program against the methods of this interface (whether using reflection or otherwise). The methods
* in {@code WebappClassLoaderBase} are protected by the default security manager if one is in use.
*
* @since 8.0, 7.0.64
*/
public interface InstrumentableClassLoader {
/**
* Adds the specified class file transformer to this class loader. The transformer will then be able to instrument
* the bytecode of any classes loaded by this class loader after the invocation of this method.
*
* @param transformer The transformer to add to the class loader
*
* @throws IllegalArgumentException if the {@literal transformer} is null.
*/
void addTransformer(ClassFileTransformer transformer);
/**
* Removes the specified class file transformer from this class loader. It will no longer be able to instrument the
* byte code of any classes loaded by the class loader after the invocation of this method. However, any classes
* already instrumented by this transformer before this method call will remain in their instrumented state.
*
* @param transformer The transformer to remove
*/
void removeTransformer(ClassFileTransformer transformer);
/**
* Returns a copy of this class loader without any class file transformers. This is a tool often used by Java
* Persistence API providers to inspect entity classes in the absence of any instrumentation, something that can't
* be guaranteed within the context of a {@link ClassFileTransformer}'s
* {@link ClassFileTransformer#transform(ClassLoader, String, Class, java.security.ProtectionDomain, byte[])
* transform} method.
* <p>
* The returned class loader's resource cache will have been cleared so that classes already instrumented will not
* be retained or returned.
*
* @return the transformer-free copy of this class loader.
*/
ClassLoader copyWithoutTransformers();
}
|