Search in sources :

Example 6 with IllegalClassFormatException

use of java.lang.instrument.IllegalClassFormatException in project jersey by jersey.

the class PerfTestAgent method premain.

public static void premain(String agentArgs, Instrumentation instrumentation) {
    final String handlerClassName = (agentArgs != null && !agentArgs.isEmpty()) ? agentArgs.substring(0, agentArgs.lastIndexOf('.')) : HANDLER_CLASS_NAME;
    final String handlerMethodName = (agentArgs != null && !agentArgs.isEmpty()) ? agentArgs.substring(agentArgs.lastIndexOf('.') + 1) : HANDLER_METHOD_NAME;
    instrumentation.addTransformer(new ClassFileTransformer() {

        @Override
        public byte[] transform(ClassLoader loader, String className, Class<?> aClass, ProtectionDomain protectionDomain, byte[] bytes) throws IllegalClassFormatException {
            if (handlerClassName.replaceAll("\\.", "/").equals(className)) {
                try {
                    ClassPool cp = ClassPool.getDefault();
                    cp.appendSystemPath();
                    CtClass cc = cp.makeClass(new java.io.ByteArrayInputStream(bytes));
                    final CtField ctxField = CtField.make("public static final agent.metrics.Timer.Context agentTimerCtx;", cc);
                    final CtField registryField = CtField.make("public static final agent.metrics.MetricRegistry agentREG = new agent.metrics.MetricRegistry();", cc);
                    final CtField reporterField = CtField.make("public static final agent.metrics.JmxReporter agentReporter = agent.metrics.JmxReporter.forRegistry(agentREG).build();", cc);
                    final CtField timerField = CtField.make("public static final agent.metrics.Timer agentTimer = " + "agentREG.timer(agent.metrics.MetricRegistry.name(\"" + handlerClassName + "\", new String[] {\"" + handlerMethodName + "\"}));", cc);
                    cc.addField(registryField);
                    cc.addField(reporterField);
                    cc.addField(timerField);
                    cc.makeClassInitializer().insertAfter("agentReporter.start();");
                    CtMethod m = cc.getDeclaredMethod(handlerMethodName);
                    m.addLocalVariable("agentCtx", ctxField.getType());
                    m.insertBefore("agentCtx = agentTimer.time();");
                    m.insertAfter("agentCtx.stop();", true);
                    byte[] byteCode = cc.toBytecode();
                    cc.detach();
                    System.out.printf("Jersey Perf Agent Instrumentation Done! (instrumented method: %s)\n", m.getLongName());
                    return byteCode;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            return null;
        }
    });
}
Also used : ProtectionDomain(java.security.ProtectionDomain) ClassFileTransformer(java.lang.instrument.ClassFileTransformer) ClassPool(javassist.ClassPool) IllegalClassFormatException(java.lang.instrument.IllegalClassFormatException) CtClass(javassist.CtClass) CtField(javassist.CtField) IllegalClassFormatException(java.lang.instrument.IllegalClassFormatException) CtMethod(javassist.CtMethod)

Example 7 with IllegalClassFormatException

use of java.lang.instrument.IllegalClassFormatException in project pinpoint by naver.

the class DefaultTranslator method customTransformer.

private byte[] customTransformer(String jvmClassName) {
    logger.info("Modify find classname:{}, loader:{}", jvmClassName, loader);
    MatchableClassFileTransformer transformer = transformerMap.get(jvmClassName);
    if (transformer == null) {
        return null;
    }
    logger.info("Modify jvmClassName:{},  modifier{}, loader:{}", jvmClassName, transformer, loader);
    final Thread thread = Thread.currentThread();
    final ClassLoader beforeClassLoader = thread.getContextClassLoader();
    thread.setContextClassLoader(loader);
    try {
        String javaClassName = JavaAssistUtils.jvmNameToJavaName(jvmClassName);
        byte[] transformBytes = transformer.transform(loader, javaClassName, null, null, null);
        return transformBytes;
    } catch (IllegalClassFormatException e) {
        throw new RuntimeException(jvmClassName + " transform fail", e);
    } finally {
        thread.setContextClassLoader(beforeClassLoader);
    }
}
Also used : MatchableClassFileTransformer(com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformer) IllegalClassFormatException(java.lang.instrument.IllegalClassFormatException)

Example 8 with IllegalClassFormatException

use of java.lang.instrument.IllegalClassFormatException in project Payara by payara.

the class WebappClassLoader method addTransformer.

/**
 * Add a new ClassFileTransformer to this class loader. This transfomer should be called for
 * each class loading event.
 *
 * @param transformer new class file transformer to do byte code enhancement.
 */
public void addTransformer(final ClassFileTransformer transformer) {
    final WebappClassLoader cl = this;
    addByteCodePreprocessor(new BytecodePreprocessor() {

        /*
                 * This class adapts ClassFileTransformer to ByteCodePreprocessor that
                 * is used inside WebappClassLoader.
                 */
        public boolean initialize(Hashtable parameters) {
            return true;
        }

        public byte[] preprocess(String resourceName, byte[] classBytes) {
            try {
                // convert java/lang/Object.class to java/lang/Object
                String classname = resourceName.substring(0, // ".class" size = 6
                resourceName.length() - 6);
                byte[] newBytes = transformer.transform(cl, classname, null, null, classBytes);
                // to return non-null byte array.
                return newBytes == null ? classBytes : newBytes;
            } catch (IllegalClassFormatException e) {
                logger.logp(Level.WARNING, "WebModuleListener$InstrumentableClassLoader$BytecodePreprocessor", "preprocess", e.getMessage());
                throw new RuntimeException(e);
            }
        }
    });
}
Also used : BytecodePreprocessor(com.sun.appserv.BytecodePreprocessor) IllegalClassFormatException(java.lang.instrument.IllegalClassFormatException)

Example 9 with IllegalClassFormatException

use of java.lang.instrument.IllegalClassFormatException in project Payara by payara.

the class ACCClassLoader method copyClass.

private Class<?> copyClass(final Class c) throws ClassNotFoundException {
    final String name = c.getName();
    final ProtectionDomain pd = c.getProtectionDomain();
    byte[] bytecode = readByteCode(name);
    for (ClassFileTransformer xf : transformers) {
        try {
            bytecode = xf.transform(this, name, null, pd, bytecode);
        } catch (IllegalClassFormatException ex) {
            throw new ClassNotFoundException(name, ex);
        }
    }
    return defineClass(name, bytecode, 0, bytecode.length, pd);
}
Also used : ProtectionDomain(java.security.ProtectionDomain) ClassFileTransformer(java.lang.instrument.ClassFileTransformer) IllegalClassFormatException(java.lang.instrument.IllegalClassFormatException)

Example 10 with IllegalClassFormatException

use of java.lang.instrument.IllegalClassFormatException in project jetty.project by eclipse.

the class WebAppClassLoader method foundClass.

/* ------------------------------------------------------------ */
protected Class<?> foundClass(final String name, URL url) throws ClassNotFoundException {
    if (_transformers.isEmpty())
        return super.findClass(name);
    InputStream content = null;
    try {
        content = url.openStream();
        byte[] bytes = IO.readBytes(content);
        if (LOG.isDebugEnabled())
            LOG.debug("foundClass({}) url={} cl={}", name, url, this);
        for (ClassFileTransformer transformer : _transformers) {
            byte[] tmp = transformer.transform(this, name, null, null, bytes);
            if (tmp != null)
                bytes = tmp;
        }
        return defineClass(name, bytes, 0, bytes.length);
    } catch (IOException e) {
        throw new ClassNotFoundException(name, e);
    } catch (IllegalClassFormatException e) {
        throw new ClassNotFoundException(name, e);
    } finally {
        if (content != null) {
            try {
                content.close();
            } catch (IOException e) {
                throw new ClassNotFoundException(name, e);
            }
        }
    }
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer) InputStream(java.io.InputStream) IllegalClassFormatException(java.lang.instrument.IllegalClassFormatException) IOException(java.io.IOException)

Aggregations

IllegalClassFormatException (java.lang.instrument.IllegalClassFormatException)14 ClassFileTransformer (java.lang.instrument.ClassFileTransformer)9 ProtectionDomain (java.security.ProtectionDomain)5 MatchableClassFileTransformer (com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformer)2 IOException (java.io.IOException)2 InputStream (java.io.InputStream)2 URLClassLoader (java.net.URLClassLoader)2 CtClass (javassist.CtClass)2 Test (org.junit.Test)2 BytecodePreprocessor (com.sun.appserv.BytecodePreprocessor)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 String (java.lang.String)1 Field (java.lang.reflect.Field)1 URL (java.net.URL)1 CodeSource (java.security.CodeSource)1 Certificate (java.security.cert.Certificate)1 ArrayList (java.util.ArrayList)1 Manifest (java.util.jar.Manifest)1 ClassPool (javassist.ClassPool)1 CtField (javassist.CtField)1