use of java.lang.instrument.ClassFileTransformer 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);
}
}
}
}
use of java.lang.instrument.ClassFileTransformer in project jetty.project by eclipse.
the class WebAppClassLoaderTest method testNullClassFileTransformer.
@Test
public void testNullClassFileTransformer() throws Exception {
_loader.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
return null;
}
});
assertCanLoadClass("org.acme.webapp.ClassInJarA");
}
use of java.lang.instrument.ClassFileTransformer in project byte-buddy by raphw.
the class AgentBuilderLambdaInstrumentationStrategyTest method testEnabledStrategyNeverThrowsException.
@Test
public void testEnabledStrategyNeverThrowsException() throws Exception {
ClassFileTransformer initialClassFileTransformer = mock(ClassFileTransformer.class);
assertThat(LambdaFactory.register(initialClassFileTransformer, mock(AgentBuilder.Default.LambdaInstrumentationStrategy.LambdaInstanceFactory.class)), is(true));
try {
ByteBuddy byteBuddy = mock(ByteBuddy.class);
Instrumentation instrumentation = mock(Instrumentation.class);
ClassFileTransformer classFileTransformer = mock(ClassFileTransformer.class);
try {
AgentBuilder.Default.LambdaInstrumentationStrategy.ENABLED.apply(byteBuddy, instrumentation, classFileTransformer);
} finally {
assertThat(LambdaFactory.release(classFileTransformer), is(false));
}
} finally {
assertThat(LambdaFactory.release(initialClassFileTransformer), is(true));
}
}
use of java.lang.instrument.ClassFileTransformer in project byte-buddy by raphw.
the class AgentBuilderDefaultApplicationRedefineTest method testRetransformation.
@Test
@AgentAttachmentRule.Enforce(retransformsClasses = true)
@IntegrationRule.Enforce
public void testRetransformation() throws Exception {
// A redefinition reflects on loaded types which are eagerly validated types (Java 7- for redefinition).
// This causes type equality for outer/inner classes to fail which is why an external class is used.
assertThat(ByteBuddyAgent.install(), instanceOf(Instrumentation.class));
// ensure that class is loaded
assertThat(simpleTypeLoader.loadClass(SimpleType.class.getName()).getName(), is(SimpleType.class.getName()));
ClassFileTransformer classFileTransformer = new AgentBuilder.Default().ignore(none()).disableClassFormatChanges().with(AgentBuilder.RedefinitionStrategy.REDEFINITION).with(descriptionStrategy).type(ElementMatchers.is(SimpleType.class), ElementMatchers.is(simpleTypeLoader)).transform(new FooTransformer()).installOnByteBuddyAgent();
try {
Class<?> type = simpleTypeLoader.loadClass(SimpleType.class.getName());
assertThat(type.getDeclaredMethod(FOO).invoke(type.getDeclaredConstructor().newInstance()), is((Object) BAR));
} finally {
ByteBuddyAgent.getInstrumentation().removeTransformer(classFileTransformer);
}
}
use of java.lang.instrument.ClassFileTransformer in project byte-buddy by raphw.
the class AgentBuilderDefaultApplicationRedefineTest method testRetransformationOptionalType.
@Test
@AgentAttachmentRule.Enforce(retransformsClasses = true)
@IntegrationRule.Enforce
public void testRetransformationOptionalType() throws Exception {
// A redefinition reflects on loaded types which are eagerly validated types (Java 7- for redefinition).
// This causes type equality for outer/inner classes to fail which is why an external class is used.
assertThat(ByteBuddyAgent.install(), instanceOf(Instrumentation.class));
// ensure that class is loaded
assertThat(optionalTypeLoader.loadClass(SimpleOptionalType.class.getName()).getName(), is(SimpleOptionalType.class.getName()));
ClassFileTransformer classFileTransformer = new AgentBuilder.Default(new ByteBuddy().with(TypeValidation.DISABLED)).ignore(none()).disableClassFormatChanges().with(AgentBuilder.RedefinitionStrategy.REDEFINITION).with(descriptionStrategy).type(ElementMatchers.is(SimpleOptionalType.class), ElementMatchers.is(optionalTypeLoader)).transform(new FooTransformer()).installOnByteBuddyAgent();
try {
Class<?> type = optionalTypeLoader.loadClass(SimpleOptionalType.class.getName());
// The hybrid strategy cannot transform optional types.
assertThat(type.getDeclaredMethod(FOO).invoke(type.getDeclaredConstructor().newInstance()), is((Object) BAR));
} finally {
ByteBuddyAgent.getInstrumentation().removeTransformer(classFileTransformer);
}
}
Aggregations