Search in sources :

Example 6 with ClassPool

use of javassist.ClassPool 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 ClassPool

use of javassist.ClassPool in project hibernate-orm by hibernate.

the class MapProxyTool method generate.

/**
	 * Protected for test only
	 */
protected static Class generate(String className, Map<String, Class<?>> properties) {
    try {
        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.makeClass(className);
        cc.addInterface(resolveCtClass(Serializable.class));
        cc.addField(new CtField(resolveCtClass(Map.class), "theMap", cc));
        cc.addConstructor(generateConstructor(className, cc));
        for (Entry<String, Class<?>> entry : properties.entrySet()) {
            // add getter
            cc.addMethod(generateGetter(cc, entry.getKey(), entry.getValue()));
            // add setter
            cc.addMethod(generateSetter(cc, entry.getKey(), entry.getValue()));
        }
        return cc.toClass();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
Also used : CtClass(javassist.CtClass) Serializable(java.io.Serializable) CtField(javassist.CtField) ClassPool(javassist.ClassPool) CtClass(javassist.CtClass) CannotCompileException(javassist.CannotCompileException) NotFoundException(javassist.NotFoundException) ClassLoadingException(org.hibernate.boot.registry.classloading.spi.ClassLoadingException)

Example 8 with ClassPool

use of javassist.ClassPool in project hibernate-orm by hibernate.

the class EnhancerTestUtils method enhanceAndDecompile.

/**
	 * method that performs the enhancement of a class
	 * also checks the signature of enhanced entities methods using 'javap' decompiler
	 */
public static Class<?> enhanceAndDecompile(Class<?> classToEnhance, ClassLoader cl) throws Exception {
    CtClass entityCtClass = generateCtClassForAnEntity(classToEnhance);
    byte[] original = entityCtClass.toBytecode();
    byte[] enhanced = Environment.getBytecodeProvider().getEnhancer(new EnhancerTestContext()).enhance(entityCtClass.getName(), original);
    assertFalse("entity was not enhanced", enhanced == null);
    log.infof("enhanced entity [%s]", entityCtClass.getName());
    ClassPool cp = new ClassPool(false);
    cp.appendClassPath(new LoaderClassPath(cl));
    CtClass enhancedCtClass = cp.makeClass(new ByteArrayInputStream(enhanced));
    enhancedCtClass.debugWriteFile(workingDir);
    DecompileUtils.decompileDumpedClass(workingDir, classToEnhance.getName());
    Class<?> enhancedClass = enhancedCtClass.toClass(cl, EnhancerTestUtils.class.getProtectionDomain());
    assertNotNull(enhancedClass);
    return enhancedClass;
}
Also used : CtClass(javassist.CtClass) ByteArrayInputStream(java.io.ByteArrayInputStream) ClassPool(javassist.ClassPool) LoaderClassPath(javassist.LoaderClassPath)

Example 9 with ClassPool

use of javassist.ClassPool in project pinpoint by naver.

the class TestBootstrapClass method test.

@Test
public void test() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException, CannotCompileException {
    URLClassLoader classLoader = new URLClassLoader(new URL[] {});
    LoaderClassPath loaderClassPath = new LoaderClassPath(classLoader);
    ClassPool cp = new ClassPool();
    cp.appendClassPath(loaderClassPath);
    CtClass ctClass = cp.makeClass(TEST_CLASS_NAME);
    byte[] bytes = ctClass.toBytecode();
    logger.debug(classLoader.getClass().getName());
    Class<?> aClass = BytecodeUtils.defineClass(classLoader, TEST_CLASS_NAME, bytes);
    logger.debug("{}", aClass.getName());
}
Also used : CtClass(javassist.CtClass) URLClassLoader(java.net.URLClassLoader) ClassPool(javassist.ClassPool) LoaderClassPath(javassist.LoaderClassPath) Test(org.junit.Test)

Example 10 with ClassPool

use of javassist.ClassPool in project pinpoint by naver.

the class JavaAssistTest method setUp.

@Before
public void setUp() throws Exception {
    pool = new ClassPool();
    pool.appendSystemPath();
}
Also used : ClassPool(javassist.ClassPool) Before(org.junit.Before)

Aggregations

ClassPool (javassist.ClassPool)44 CtClass (javassist.CtClass)32 CtMethod (javassist.CtMethod)16 NotFoundException (javassist.NotFoundException)15 CannotCompileException (javassist.CannotCompileException)10 LoaderClassPath (javassist.LoaderClassPath)9 CtField (javassist.CtField)8 IOException (java.io.IOException)7 Test (org.junit.Test)7 File (java.io.File)6 CtConstructor (javassist.CtConstructor)6 FileNotFoundException (java.io.FileNotFoundException)5 MethodInfo (javassist.bytecode.MethodInfo)4 Method (java.lang.reflect.Method)3 ConstPool (javassist.bytecode.ConstPool)3 DirectoryInput (com.android.build.api.transform.DirectoryInput)2 JarInput (com.android.build.api.transform.JarInput)2 InjectParam (com.taobao.android.builder.tools.classinject.InjectParam)2 FileFilter (java.io.FileFilter)2 IllegalClassFormatException (java.lang.instrument.IllegalClassFormatException)2