Mega Code Archive

 
Categories / Java / Development Class
 

Demonstrates the use of interface based proxies

/* 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 interface based proxies.  *  * @author <a href=mailto:kraythe@arcor.de>Robert Simmons jr. (kraythe)</a>  * @version $Revision: 1.2 $  */ public class DemoInterfaceProxy {   /**     * Use a proxy and check the count.    */   public static final void checkCount() {     SomeClass proxy = SomeClassFactory.getSomeClassProxy();     proxy.someMethod();     proxy.someOtherMethod("Our Proxy works!");     if (proxy instanceof SomeClassCountingProxy) {       System.out.println(((SomeClassCountingProxy)proxy).getInvocationCount());     }   }   /**     * Run the demonstration.    *    * @param args Command Line Arguments (ignored).    */   public static final void main(final String[] args) {     SomeClass proxy = SomeClassFactory.getSomeClassProxy();     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 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();     }   } }