Search in sources :

Example 61 with ClassFileTransformer

use of java.lang.instrument.ClassFileTransformer in project byte-buddy by raphw.

the class AgentBuilderDefaultApplicationTest method testDecoration.

@Test
@AgentAttachmentRule.Enforce
@IntegrationRule.Enforce
public void testDecoration() throws Exception {
    assertThat(ByteBuddyAgent.install(), instanceOf(Instrumentation.class));
    ClassFileTransformer classFileTransformer = new AgentBuilder.Default().with(poolStrategy).ignore(none()).type(ElementMatchers.is(Foo.class), ElementMatchers.is(classLoader)).transform(new BarAdviceTransformer()).type(ElementMatchers.is(Foo.class), ElementMatchers.is(classLoader)).transform(new QuxAdviceTransformer()).asDecorator().installOnByteBuddyAgent();
    try {
        Class<?> type = classLoader.loadClass(Foo.class.getName());
        assertThat(type.getDeclaredMethod(FOO).invoke(type.getDeclaredConstructor().newInstance()), is((Object) (FOO + BAR + QUX)));
    } finally {
        ByteBuddyAgent.getInstrumentation().removeTransformer(classFileTransformer);
    }
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer) Instrumentation(java.lang.instrument.Instrumentation) Test(org.junit.Test)

Example 62 with ClassFileTransformer

use of java.lang.instrument.ClassFileTransformer in project byte-buddy by raphw.

the class AgentBuilderDefaultApplicationTest method testInstanceCapturingLambda.

@Test
@JavaVersionRule.Enforce(8)
@AgentAttachmentRule.Enforce(redefinesClasses = true)
@IntegrationRule.Enforce
public void testInstanceCapturingLambda() throws Exception {
    assertThat(ByteBuddyAgent.install(), instanceOf(Instrumentation.class));
    ClassLoader classLoader = lambdaSamples();
    ClassFileTransformer classFileTransformer = new AgentBuilder.Default().with(poolStrategy).ignore(none()).with(AgentBuilder.LambdaInstrumentationStrategy.ENABLED).type(isSubTypeOf(Callable.class)).transform(new SingleMethodReplacer("call")).installOn(ByteBuddyAgent.getInstrumentation());
    try {
        Class<?> sampleFactory = classLoader.loadClass(LAMBDA_SAMPLE_FACTORY);
        @SuppressWarnings("unchecked") Callable<String> instance = (Callable<String>) sampleFactory.getDeclaredMethod("instanceCapturing").invoke(sampleFactory.getDeclaredConstructor().newInstance());
        assertThat(instance.call(), is(BAR));
    } finally {
        ByteBuddyAgent.getInstrumentation().removeTransformer(classFileTransformer);
        AgentBuilder.LambdaInstrumentationStrategy.release(classFileTransformer, ByteBuddyAgent.getInstrumentation());
    }
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer) Instrumentation(java.lang.instrument.Instrumentation) ByteArrayClassLoader(net.bytebuddy.dynamic.loading.ByteArrayClassLoader) Callable(java.util.concurrent.Callable) Test(org.junit.Test)

Example 63 with ClassFileTransformer

use of java.lang.instrument.ClassFileTransformer in project byte-buddy by raphw.

the class AgentBuilderDefaultTest method testIgnoredTypeMatcherOnlyAppliedOnceWithMultipleTransformations.

@Test
public void testIgnoredTypeMatcherOnlyAppliedOnceWithMultipleTransformations() throws Exception {
    AgentBuilder.RawMatcher ignored = mock(AgentBuilder.RawMatcher.class);
    ClassFileTransformer classFileTransformer = new AgentBuilder.Default(byteBuddy).with(initializationStrategy).with(poolStrategy).with(typeStrategy).with(installationListener).with(listener).disableNativeMethodPrefix().ignore(ignored).type(typeMatcher).transform(transformer).type(typeMatcher).transform(transformer).installOn(instrumentation);
    assertThat(transform(classFileTransformer, JavaModule.ofType(REDEFINED), REDEFINED.getClassLoader(), REDEFINED.getName(), REDEFINED, REDEFINED.getProtectionDomain(), QUX), nullValue(byte[].class));
    verify(listener).onIgnored(new TypeDescription.ForLoadedType(REDEFINED), REDEFINED.getClassLoader(), JavaModule.ofType(REDEFINED), true);
    verify(listener).onComplete(REDEFINED.getName(), REDEFINED.getClassLoader(), JavaModule.ofType(REDEFINED), true);
    verifyNoMoreInteractions(listener);
    verify(ignored).matches(new TypeDescription.ForLoadedType(REDEFINED), REDEFINED.getClassLoader(), JavaModule.ofType(REDEFINED), REDEFINED, REDEFINED.getProtectionDomain());
    verifyNoMoreInteractions(ignored);
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer) TypeDescription(net.bytebuddy.description.type.TypeDescription) Test(org.junit.Test)

Example 64 with ClassFileTransformer

use of java.lang.instrument.ClassFileTransformer in project byte-buddy by raphw.

the class AgentBuilderLambdaInstrumentationStrategyTest method testDisabledStrategyIsNoOp.

@Test
public void testDisabledStrategyIsNoOp() throws Exception {
    ByteBuddy byteBuddy = mock(ByteBuddy.class);
    Instrumentation instrumentation = mock(Instrumentation.class);
    ClassFileTransformer classFileTransformer = mock(ClassFileTransformer.class);
    AgentBuilder.Default.LambdaInstrumentationStrategy.DISABLED.apply(byteBuddy, instrumentation, classFileTransformer);
    verifyZeroInteractions(byteBuddy);
    verifyZeroInteractions(instrumentation);
    verifyZeroInteractions(classFileTransformer);
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer) ByteBuddy(net.bytebuddy.ByteBuddy) Instrumentation(java.lang.instrument.Instrumentation) Test(org.junit.Test)

Example 65 with ClassFileTransformer

use of java.lang.instrument.ClassFileTransformer in project jdk8u_jdk by JetBrains.

the class TransformerManager method transform.

public byte[] transform(ClassLoader loader, String classname, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {
    boolean someoneTouchedTheBytecode = false;
    TransformerInfo[] transformerList = getSnapshotTransformerList();
    byte[] bufferToUse = classfileBuffer;
    // order matters, gotta run 'em in the order they were added
    for (int x = 0; x < transformerList.length; x++) {
        TransformerInfo transformerInfo = transformerList[x];
        ClassFileTransformer transformer = transformerInfo.transformer();
        byte[] transformedBytes = null;
        try {
            transformedBytes = transformer.transform(loader, classname, classBeingRedefined, protectionDomain, bufferToUse);
        } catch (Throwable t) {
        // don't let any one transformer mess it up for the others.
        // This is where we need to put some logging. What should go here? FIXME
        }
        if (transformedBytes != null) {
            someoneTouchedTheBytecode = true;
            bufferToUse = transformedBytes;
        }
    }
    // if someone modified it, return the modified buffer.
    // otherwise return null to mean "no transforms occurred"
    byte[] result;
    if (someoneTouchedTheBytecode) {
        result = bufferToUse;
    } else {
        result = null;
    }
    return result;
}
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