Search in sources :

Example 71 with ClassFileTransformer

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.");
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer)

Example 72 with ClassFileTransformer

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;
        }
    });
}
Also used : ProtectionDomain(java.security.ProtectionDomain) ClassFileTransformer(java.lang.instrument.ClassFileTransformer) IllegalClassFormatException(java.lang.instrument.IllegalClassFormatException)

Example 73 with ClassFileTransformer

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;
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer) PluginClassFileTransformer(org.hotswap.agent.annotation.handler.PluginClassFileTransformer) PluginClassFileTransformer(org.hotswap.agent.annotation.handler.PluginClassFileTransformer) LinkedList(java.util.LinkedList)

Example 74 with ClassFileTransformer

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;
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer) MatchableClassFileTransformer(com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformer) MatchableClassFileTransformer(com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformer) ArrayList(java.util.ArrayList)

Example 75 with ClassFileTransformer

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;
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer)

Aggregations

ClassFileTransformer (java.lang.instrument.ClassFileTransformer)81 Test (org.junit.Test)40 Instrumentation (java.lang.instrument.Instrumentation)37 IllegalClassFormatException (java.lang.instrument.IllegalClassFormatException)17 ProtectionDomain (java.security.ProtectionDomain)12 ByteArrayClassLoader (net.bytebuddy.dynamic.loading.ByteArrayClassLoader)9 Callable (java.util.concurrent.Callable)7 MatchableClassFileTransformer (com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformer)6 SimpleType (net.bytebuddy.test.packaging.SimpleType)6 ArrayList (java.util.ArrayList)5 ByteBuddy (net.bytebuddy.ByteBuddy)5 IOException (java.io.IOException)4 URLClassLoader (java.net.URLClassLoader)4 ByteArrayInputStream (java.io.ByteArrayInputStream)3 ByteArrayOutputStream (java.io.ByteArrayOutputStream)3 InputStream (java.io.InputStream)3 URL (java.net.URL)3 CodeSource (java.security.CodeSource)3 UnmodifiableClassException (java.lang.instrument.UnmodifiableClassException)2 Certificate (java.security.cert.Certificate)2