Java tutorial
/* joeyin Our Proxy works! */ import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /* * * This software is granted under the terms of the Common Public License, * CPL, which may be found at the following URL: * http://www-124.ibm.com/developerworks/oss/CPLv1.0.htm * * Copyright(c) 2003-2005 by the authors indicated in the @author tags. * All Rights are Reserved by the various authors. * ########## DO NOT EDIT ABOVE THIS LINE ########## */ /** * Demonstrates the use of factories to generate proxies. * * @author <a href=mailto:kraythe@arcor.de>Robert Simmons jr. (kraythe)</a> * @version $Revision: 1.2 $ */ public class DemoProxyFactory { /** * Run the demonstration. * * @param args Command Line Arguments (ignored). */ public static final void main(final String[] args) { SomeClassProxy proxy = SomeClassFactory.getProxy(); proxy.someMethod(); proxy.someOtherMethod("Our Proxy works!"); } } class SomeClassFactory { /** * Gets a counting proxy to an object that is constructed with the user name. * * @return The proxy to the implementation. */ public static final SomeClassCountingProxy getCountingProxy() { SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name")); return new SomeClassCountingProxy(impl); } /** * Gets proxy to depending upon debug status in Log4J. * * @return The proxy to the implementation. */ public static final SomeClass getDynamicSomeClassProxy() { SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name")); InvocationHandler handler = new MethodCountingHandler(impl); Class[] interfaces = new Class[] { SomeClass.class }; ClassLoader loader = SomeClassFactory.class.getClassLoader(); SomeClass proxy = (SomeClass) Proxy.newProxyInstance(loader, interfaces, handler); return proxy; } /** * Gets a proxy to an object that is constructed with the user name. * * @return The proxy to the implementation. */ public static final SomeClassProxy getProxy() { SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name")); return new SomeClassProxy(impl); } /** * Gets proxy to depending upon debug status in Log4J. * * @return The proxy to the implementation. */ public static final SomeClass getSomeClassProxy() { SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name")); if (true) { return new SomeClassCountingProxy(impl); } else { return new SomeClassProxy(impl); } } } class SomeClassCountingProxy implements SomeClass { /** The implementation object for this proxy. */ private final SomeClassImpl impl; /** Holds the invocation count. */ private int invocationCount = 0; /** * Creates a new SomeClassProxy object. * * @param impl The implementation object for this proxy. */ public SomeClassCountingProxy(final SomeClassImpl impl) { this.impl = impl; } /** * Gets the value of the property invocationCount. * * @return The current value of invocationCount */ public int getInvocationCount() { return invocationCount; } /** * @see java2s.hcj.proxies.SomeClass#someMethod() */ public void someMethod() { this.invocationCount++; this.impl.someMethod(); } /** * @see java2s.hcj.proxies.SomeClass#someOtherMethod(java.lang.String) */ public void someOtherMethod(String text) { this.invocationCount++; this.impl.someOtherMethod(text); } } class SomeClassImpl implements SomeClass { /** Holds the user name. */ private String userName; /** * Creates a new SomeClass object. * * @param userName * The user name to use. */ public SomeClassImpl(final String userName) { this.userName = userName; } /** * @see java2s.hcj.proxies.SomeClass#someOtherMethod(java.lang.String) */ public void someMethod() { System.out.println(this.userName); } /** * @see java2s.hcj.proxies.SomeClass#someOtherMethod(java.lang.String) */ public void someOtherMethod(final String text) { System.out.println(text); } } class SomeClassProxy implements SomeClass { /** The impl object for this proxy. */ private final SomeClassImpl impl; /** * Creates a new SomeClassProxy object. * * @param impl * The implementation object for this proxy. */ public SomeClassProxy(final SomeClassImpl impl) { this.impl = impl; } /** * @see java2s.hcj.proxies.SomeClass#someMethod() */ public void someMethod() { this.impl.someMethod(); } /** * @see java2s.hcj.proxies.SomeClass#someOtherMethod(java.lang.String) */ public void someOtherMethod(String text) { this.impl.someOtherMethod(text); } } interface SomeClass { /** * Print out the user name. */ public abstract void someMethod(); /** * Print out the string given to us. * * @param text * The string to print. */ public abstract void someOtherMethod(final String text); } /** * An invocation handler that counts the number of calls for all methods in the * target class. * * @author <a href=mailto:kraythe@arcor.de>Robert Simmons jr. (kraythe)</a> * @version $Revision: 1.2 $ * * @see java.lang.reflect.InvocationHandler */ class MethodCountingHandler implements InvocationHandler { /** The implementation object for this proxy. */ private final Object impl; /** Holds the invocation count. */ private int invocationCount = 0; /** * Creates a new MethodCOuntingHandler object. * * @param impl */ public MethodCountingHandler(final Object impl) { this.impl = impl; } /** * Gets the value of the property invocationCount. * * @return The current value of invocationCount */ public int getInvocationCount() { return invocationCount; } /** * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, * java.lang.reflect.Method, java.lang.Object[]) */ 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(); } } }