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 }