Demonstrates a dynamic proxy : Dynamic Proxy « Development Class « Java






Demonstrates a dynamic proxy

/*
joeyin
Our Proxy works!
2
*/







/*
 *
 * 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 ########## */

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.Logger;

/**
 * Demonstrates a dynamic proxy.
 * 
 * @author <a href=mailto:kraythe@arcor.de>Robert Simmons jr. (kraythe)</a>
 * @version $Revision: 1.2 $
 */
public class DemoDynamicProxy {
  /**
   * Run the demonstration.
   * 
   * @param args
   *          Command Line Arguments (ignored).
   */
  public static final void main(final String[] args) {
    SomeClass proxy = SomeClassFactory.getDynamicSomeClassProxy();
    proxy.someMethod();
    proxy.someOtherMethod("Our Proxy works!");

    InvocationHandler handler = Proxy.getInvocationHandler(proxy);
    if (handler instanceof MethodCountingHandler) {
      System.out.println(((MethodCountingHandler) handler).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 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();
    }
  }
}

           
       








Related examples in the same category

1.Demonstrates a dangerous use of proxy names
2.Dynamic Action Hookup Test
3.Demonstrates the use of factories to generate proxies
4.Demonstrates the usage of a counting proxy
5.Demonstrates the use of interface based proxies
6.Demonstrates the basic concept of proxies generated by clients to the proxies