001    /*
002     * (c) 2003-2005, 2009, 2010 ThoughtWorks Ltd
003     * All rights reserved.
004     *
005     * The software in this package is published under the terms of the BSD
006     * style license a copy of which has been included with this distribution in
007     * the LICENSE.txt file.
008     * 
009     * Created on 03-May-2004
010     */
011    package com.thoughtworks.proxy;
012    
013    import java.io.Serializable;
014    
015    
016    /**
017     * Abstraction layer for proxy generation. Depending on this interface (rather than {@link java.lang.reflect.Proxy}
018     * directly) will allow you to use Java's standard proxy mechanism interchangeably with e.g. CGLIB.
019     *
020     * @author Aslak Hellesøy
021     * @since 0.1
022     */
023    public interface ProxyFactory extends Serializable {
024    
025        /**
026         * Create a new proxy instance.
027         * 
028         * @param <T> The proxy's type. 
029         * @param invoker the invocation handler.
030         * @param types   the types the proxy must emulate.
031         * @return the new proxy instance.
032         * @since 1.0
033         */
034        <T> T createProxy(Invoker invoker, Class<?>... types);
035    
036        /**
037         * Test if the ProxyFactory implementation is capable of creating a proxy instance for the given type.
038         *
039         * @param type the type to create a proxy instance for.
040         * @return <code>true</code> if the type is supported.
041         * @since 0.1
042         */
043        boolean canProxy(Class<?> type);
044    
045        /**
046         * Test if the given type is a proxy class.
047         *
048         * @param type the type to examine.
049         * @return <code>true</code> if the given type is a proxy class.
050         * @since 0.1
051         */
052        boolean isProxyClass(Class<?> type);
053    
054        /**
055         * Retrieve the invocation handler of the proxy.
056         *
057         * @param proxy the proxy instance.
058         * @return the {@link Invoker} instance acting as invocation handler.
059         * @since 0.1
060         */
061        Invoker getInvoker(Object proxy);
062    }