use of java.lang.instrument.ClassFileTransformer in project transmittable-thread-local by alibaba.
the class TtlAgent method install.
static void install(String agentArgs, Instrumentation inst) {
logger.info("[TtlAgent.install] agentArgs: " + agentArgs + ", Instrumentation: " + inst);
ClassFileTransformer transformer = new TtlTransformer();
inst.addTransformer(transformer, true);
logger.info("[TtlAgent.install] addTransformer success.");
}
use of java.lang.instrument.ClassFileTransformer in project HotswapAgent by HotswapProjects.
the class SpringPlugin method registerBasePackage.
private void registerBasePackage(final String basePackage) {
final SpringChangesAnalyzer analyzer = new SpringChangesAnalyzer(appClassLoader);
hotswapTransformer.registerTransformer(appClassLoader, getClassNameRegExp(basePackage), new ClassFileTransformer() {
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
if (classBeingRedefined != null) {
if (analyzer.isReloadNeeded(classBeingRedefined, classfileBuffer)) {
scheduler.scheduleCommand(new ClassPathBeanRefreshCommand(classBeingRedefined.getClassLoader(), basePackage, className, classfileBuffer));
}
}
return classfileBuffer;
}
});
}
use of java.lang.instrument.ClassFileTransformer in project HotswapAgent by HotswapProjects.
the class HotswapTransformer method transform.
/**
* Main transform method called by Java instrumentation.
* <p/>
* <p>It does not do the instrumentation itself, instead iterates registered transformers and compares
* registration class regexp - if the regexp matches, the classloader is called.
* <p/>
* <p>Note that class bytes may be send to multiple transformers, but the order is not defined.
*
* @see ClassFileTransformer#transform(ClassLoader, String, Class, java.security.ProtectionDomain, byte[])
*/
@Override
public byte[] transform(final ClassLoader classLoader, String className, Class<?> redefiningClass, final ProtectionDomain protectionDomain, byte[] bytes) throws IllegalClassFormatException {
LOGGER.trace("Transform on class '{}' @{} redefiningClass '{}'.", className, classLoader, redefiningClass);
List<ClassFileTransformer> toApply = new LinkedList<>();
List<PluginClassFileTransformer> pluginTransformers = new LinkedList<>();
try {
// call transform on all registered transformers
for (RegisteredTransformersRecord transformerRecord : new LinkedList<RegisteredTransformersRecord>(registeredTransformers.values())) {
if ((className != null && transformerRecord.pattern.matcher(className).matches()) || (redefiningClass != null && transformerRecord.pattern.matcher(redefiningClass.getName()).matches())) {
for (ClassFileTransformer transformer : new LinkedList<ClassFileTransformer>(transformerRecord.transformerList)) {
if (transformer instanceof PluginClassFileTransformer) {
PluginClassFileTransformer pcft = PluginClassFileTransformer.class.cast(transformer);
if (!pcft.isPluginDisabled(classLoader)) {
pluginTransformers.add(pcft);
}
} else {
toApply.add(transformer);
}
}
}
}
} catch (Throwable t) {
LOGGER.error("Error transforming class '" + className + "'.", t);
}
if (!pluginTransformers.isEmpty()) {
pluginTransformers = reduce(classLoader, pluginTransformers, className);
}
if (toApply.isEmpty() && pluginTransformers.isEmpty()) {
LOGGER.trace("No transformers defing for {} ", className);
return bytes;
}
// ensure classloader initialized
ensureClassLoaderInitialized(classLoader, protectionDomain);
try {
byte[] result = bytes;
for (ClassFileTransformer transformer : pluginTransformers) {
LOGGER.trace("Transforming class '" + className + "' with transformer '" + transformer + "' " + "@ClassLoader" + classLoader + ".");
result = transformer.transform(classLoader, className, redefiningClass, protectionDomain, result);
}
for (ClassFileTransformer transformer : toApply) {
LOGGER.trace("Transforming class '" + className + "' with transformer '" + transformer + "' " + "@ClassLoader" + classLoader + ".");
result = transformer.transform(classLoader, className, redefiningClass, protectionDomain, result);
}
return result;
} catch (Throwable t) {
LOGGER.error("Error transforming class '" + className + "'.", t);
}
return bytes;
}
use of java.lang.instrument.ClassFileTransformer in project pinpoint by naver.
the class ClassFileTransformerProvider method getMatchableTransformers.
private List<MatchableClassFileTransformer> getMatchableTransformers(PluginContextLoadResult pluginContexts) {
Objects.requireNonNull(pluginContexts, "pluginContexts");
final List<MatchableClassFileTransformer> matcherList = new ArrayList<>();
for (ClassFileTransformer transformer : pluginContexts.getClassFileTransformer()) {
if (transformer instanceof MatchableClassFileTransformer) {
final MatchableClassFileTransformer t = (MatchableClassFileTransformer) transformer;
if (logger.isInfoEnabled()) {
logger.info("Registering class file transformer {} for {} ", t, t.getMatcher());
}
matcherList.add(t);
} else {
if (logger.isWarnEnabled()) {
logger.warn("Ignore class file transformer {}", transformer);
}
}
}
return matcherList;
}
use of java.lang.instrument.ClassFileTransformer in project pinpoint by naver.
the class DefaultDynamicTransformerRegistry method getTransformer.
@Override
public ClassFileTransformer getTransformer(ClassLoader classLoader, String targetClassName) {
// TODO fix classLoader null case
if (transformerMap.isEmpty()) {
return null;
}
final TransformerKey key = new TransformerKey(classLoader, targetClassName);
final ClassFileTransformer transformer = transformerMap.remove(key);
if (transformer != null) {
if (logger.isInfoEnabled()) {
logger.info("removed dynamic transformer classLoader: {}, className: {}, registry size: {}", classLoader, targetClassName, transformerMap.size());
}
}
return transformer;
}
Aggregations