Package xeus.jcl

Source Code of xeus.jcl.JclUtils$JclProxyHandler

/**
*  JCL (Jar Class Loader)
*
*  Copyright (C) 2009  Xeus Technologies
*
*  This file is part of Jar Class Loader (JCL).
*  Jar Class Loader (JCL) is free software: you can redistribute it and/or modify
*  it under the terms of the GNU Lesser General Public License as published by
*  the Free Software Foundation, either version 3 of the License, or
*  (at your option) any later version.
*
*  JarClassLoader is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU Lesser General Public License for more details.
*
*  You should have received a copy of the GNU Lesser General Public License
*  along with JCL.  If not, see <http://www.gnu.org/licenses/>.
*
@author Kamran Zafar
*
*  Contact Info:
*  Email:  xeus.man@gmail.com
*  Web:    http://xeustech.blogspot.com
*/

package xeus.jcl;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import xeus.jcl.exception.JclException;

@SuppressWarnings("unchecked")
public class JclUtils {

    /**
     * Casts the object ref to the passed interface class ref. It actually
     * returns a dynamic proxy for the passed object
     *
     * @param object
     * @param classes
     * @return castable
     * @return casted
     */
    public static Object toCastable(Object object, Class[] classes) {
        JclProxyHandler handler = new JclProxyHandler( object );
        return Proxy.newProxyInstance( JclUtils.class.getClassLoader(), classes, handler );
    }

    /**
     * Casts the object ref to the passed interface class ref
     *
     * @param object
     * @param clazz
     * @return castable
     * @return casted
     */
    public static Object toCastable(Object object, Class clazz) {
        return toCastable( object, new Class[] { clazz } );
    }

    /**
     * Casts the object ref to the passed interface class ref and returns it
     *
     * @param object
     * @param clazz
     * @return T reference
     * @return casted
     */
    public static <T> T cast(Object object, Class<T> clazz) {
        return (T) toCastable( object, clazz );
    }

    /**
     * Deep clones the Serializable objects in the current classloader
     *
     * @param original
     * @return clone
     */
    public static Object clone(Object original) {
        Object clone = null;
        try {
            // Increased buffer size to speed up writing
            ByteArrayOutputStream bos = new ByteArrayOutputStream( 5120 );
            ObjectOutputStream out = new ObjectOutputStream( bos );
            out.writeObject( original );
            out.flush();
            out.close();

            ObjectInputStream in = new ObjectInputStream( new ByteArrayInputStream( bos.toByteArray() ) );
            clone = in.readObject();

            in.close();
            bos.close();

            return clone;
        } catch (IOException e) {
            throw new JclException( e );
        } catch (ClassNotFoundException cnfe) {
            throw new JclException( cnfe );
        }
    }

    /**
     * proxy method invocation handler
     *
     */
    private static class JclProxyHandler implements InvocationHandler {
        private final Object delegate;

        public JclProxyHandler(Object delegate) {
            this.delegate = delegate;
        }

        /*
         * (non-Javadoc)
         *
         * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
         *      java.lang.reflect.Method, java.lang.Object[])
         */
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Method delegateMethod = delegate.getClass().getMethod( method.getName(), method.getParameterTypes() );
            return delegateMethod.invoke( delegate, args );
        }
    }

}
TOP

Related Classes of xeus.jcl.JclUtils$JclProxyHandler

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.