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;
}
});
}
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);
}
}
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);
}
}
});
}
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);
}
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);
}
}
}
}
Aggregations