001 /*
002 * Created on 03-May-2004
003 *
004 * (c) 2003-2005 ThoughtWorks Ltd
005 *
006 * See license.txt for license details
007 */
008 package com.thoughtworks.proxy.factory;
009
010 import java.lang.reflect.InvocationHandler;
011 import java.lang.reflect.Proxy;
012
013 import com.thoughtworks.proxy.Invoker;
014
015 /**
016 * A {@link com.thoughtworks.proxy.ProxyFactory} based on a JDK.
017 *
018 * @author Aslak Hellesøy
019 * @since 0.1
020 * @see com.thoughtworks.proxy.factory
021 */
022 public class StandardProxyFactory extends AbstractProxyFactory {
023
024 private static final long serialVersionUID = 4430360631813383235L;
025
026 /**
027 * The native InvocationHandler implementation.
028 *
029 * @since 0.1
030 */
031 static class StandardInvocationHandlerAdapter extends CoincidentalInvocationHandlerAdapter implements
032 InvocationHandler {
033 private static final long serialVersionUID = 141954540221604284L;
034
035 /**
036 * Construct a StandardInvocationHandlerAdapter.
037 *
038 * @param invoker the wrapping invoker instance
039 * @since 0.1
040 */
041 public StandardInvocationHandlerAdapter(Invoker invoker) {
042 super(invoker);
043 }
044 }
045
046 public <T> T createProxy(final Invoker invoker, final Class<?>... types) {
047 final Class<?>[] interfaces = new Class[types.length + 1];
048 System.arraycopy(types, 0, interfaces, 0, types.length);
049 interfaces[types.length] = InvokerReference.class;
050 @SuppressWarnings("unchecked")
051 final T proxyInstance = (T)Proxy.newProxyInstance(getClass().getClassLoader(), interfaces,
052 new StandardInvocationHandlerAdapter(invoker));
053 return proxyInstance;
054 }
055
056 public boolean canProxy(final Class<?> type) {
057 return type.isInterface();
058 }
059
060 public boolean isProxyClass(final Class<?> type) {
061 return Proxy.isProxyClass(type);
062 }
063
064 }