Mega Code Archive

 
Categories / Java / Development Class
 

Demonstrates the usage of a counting proxy

/* joeyin Our Proxy works! Method Invocation Count = 2 */ import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /**    * Demonstrates the usage of a counting proxy.  *  * @author <a href=mailto:kraythe@arcor.de>Robert Simmons jr. (kraythe)</a>  * @version $Revision: 1.2 $  */ public class DemoCountingProxy {   /**     * Run the demonstration.    *    * @param args Command Line Arguments (ignored).    */   public static final void main(final String[] args) {     SomeClassCountingProxy proxy = SomeClassFactory.getCountingProxy();     proxy.someMethod();     proxy.someOtherMethod("Our Proxy works!");     System.out.println("Method Invocation Count = " + proxy.getInvocationCount());   } } 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 rntsoft.hcj.proxies.SomeClass#someMethod()    */   public void someMethod() {     this.invocationCount++;     this.impl.someMethod();   }   /**     * @see rntsoft.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 rntsoft.hcj.proxies.SomeClass#someOtherMethod(java.lang.String)    */   public void someMethod() {     System.out.println(this.userName);   }   /**    * @see rntsoft.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 rntsoft.hcj.proxies.SomeClass#someMethod()    */   public void someMethod() {     this.impl.someMethod();   }   /**    * @see rntsoft.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();     }   } }