Package org.codehaus.aspectwerkz.transform

Source Code of org.codehaus.aspectwerkz.transform.Klass

/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved.                 *
* http://aspectwerkz.codehaus.org                                                    *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license      *
* a copy of which has been included with this distribution in the license.txt file.  *
**************************************************************************************/
package org.codehaus.aspectwerkz.transform;

import java.io.IOException;

import javassist.ByteArrayClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.LoaderClassPath;
import org.codehaus.aspectwerkz.exception.WrappedRuntimeException;

/**
* The AspectWerkz class concept.
* <p/>
* Contains informations and data about the class being transformed.
*
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r</a>
* @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur</a>
*/
public class Klass {

    /**
     * The name of the class.
     */
    private final String m_name;

    /**
     * The Javassist class gen.
     */
    private final CtClass m_ctClass;

    /**
     * The Javassist initial class gen to calculate serial ver uid based on initial bytecode Lazily initialized
     */
    private CtClass m_initialCtClass;

    /**
     * The initial bytecode of the class
     */
    private final byte[] m_initialBytecode;

    /**
     * Creates a new class.
     *
     * @param name     the name
     * @param bytecode the byte code
     */
    public Klass(final String name, final byte[] bytecode, final ClassLoader loader) {
        m_name = name.replace('/', '.');
        m_ctClass = fromByte(name, bytecode, loader);
        m_initialBytecode = bytecode;
    }

    /**
     * Returns the name of the class.
     *
     * @return the name
     */
    public String getName() {
        return m_name;
    }

    /**
     * Returns the Javassist class gen for the class.
     *
     * @return the class gen
     */
    public CtClass getCtClass() {
        return m_ctClass;
    }

    /**
     * Returns the Javassist initial class gen for the class.
     *
     * @return the initial class gen
     * @throws IOException
     */
    public CtClass getInitialCtClass() throws IOException {
        if (m_initialCtClass == null) {
            m_initialCtClass = fromByte(m_name, m_initialBytecode, null);//TODO BREAK
        }
        return m_initialCtClass;
    }

    /**
     * Returns the byte code for the class.
     *
     * @return
     */
    public byte[] getBytecode() {
        try {
            return m_ctClass.toBytecode();
        }
        catch (Exception e) {
            throw new WrappedRuntimeException(e);
        }
    }

    /**
     * Transforms byte code to a Javassist class gen.
     *
     * @param bytecode the byte code
     * @return the Javassist class gen
     */
    public static CtClass fromByte(final String name, final byte[] bytecode, final ClassLoader loader) {
        try {
            ClassPool cp = new ClassPool(null);
            cp.insertClassPath(new ByteArrayClassPath(name, bytecode));
            cp.appendClassPath(new LoaderClassPath(loader));
            return cp.get(name);
        }
        catch (Exception e) {
            throw new WrappedRuntimeException(e);
        }
    }
}
TOP

Related Classes of org.codehaus.aspectwerkz.transform.Klass

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.