Java 动态代理示例

public interface SomeClass
{
public abstract void someMethod();
public abstract void someOtherMethod(final String text);
}

public class SomeClassImpl implements SomeClass
{
private String userName;

public SomeClassImpl(final String userName)
{
this.userName = userName;
}

public void someMethod( )
{
System.out.println(this.userName);
}

public void someOtherMethod(final String text)
{
System.out.println(text);
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MethodCountingHandler implements InvocationHandler
{

/**//* whatever object, you can pass one in */
private final Object impl;
private int invocationCount = 0;

/**//* constructor */
public MethodCountingHandler(final Object impl)
{
this.impl = impl;
}

/**//* export the invocation Count */
public int getInvocationCount( )
{
return invocationCount;
}

/**//* implements the interface function of InvocationHandler */
public Object invoke(Object proxy, Method meth, Object[] args) throws Throwable
{
try
{
this.invocationCount++;
Object result = meth.invoke(impl, args);
return result;
} catch (final InvocationTargetException ex)
{
throw ex.getTargetException( );
}
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class SomeClassFactory
{

public static final SomeClass getDynamicSomeClassProxy( )
{

/**//* get a implement instance of SomeClass */
SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name"));
if ( !(impl instanceof SomeClass) )
return null;

/**//* construct a invocation handler with the impl instance */
InvocationHandler handler = new MethodCountingHandler(impl);

/**//* get the class info, and the class loader used by this factory */
Class[] interfaces = new Class[]
{ SomeClass.class };
ClassLoader loader = SomeClassFactory.class.getClassLoader( );

/**//*
* install the handler for all implementations of this interface in this class loader
* and return the proxy instance which accords to SomeClass interface.
*/
SomeClass proxy = (SomeClass)Proxy.newProxyInstance(loader,
interfaces,
handler);
return proxy;
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class DemoDynamicProxy
{

public static final void main(final String[] args)
{
SomeClass proxy = SomeClassFactory.getDynamicSomeClassProxy( );
proxy.someMethod( );
proxy.someOtherMethod("Our Proxy works!");

/**//* get the handler associated with this proxy instance */
InvocationHandler handler = Proxy.getInvocationHandler(proxy);

if (handler instanceof MethodCountingHandler)
{
System.out.println(((MethodCountingHandler)handler).getInvocationCount( ));
}
}
}
Java的动态代理只支持基于Interface的Method Interception. 本例是从”Hardcore Java”一书中摘取出来的.
