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 }