Mega Code Archive

 
Categories / Java / Reflection
 

Demonstration of speed of reflexive versus programmatic invocation

/*  *     file: ReflexiveInvocation.java  *  package: oreilly.hcj.reflection  *  * 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.InvocationTargetException; import java.lang.reflect.Method; /**  * Demonstration of speed of reflexive versus programatic invocation.  *   * @author <a href=mailto:kraythe@arcor.de>Robert Simmons jr. (kraythe)</a>  * @version $Revision: 1.3 $  */ public class ReflexiveInvocation {   /** Holds value of property value. */   private String value = "some value";   /**    * Creates a new instance of ReflexiveInvocation    */   public ReflexiveInvocation() {   }   /**    * Main demo method.    *     * @param args    *          the command line arguments    *     * @throws RuntimeException    *           __UNDOCUMENTED__    */   public static void main(final String[] args) {     try {       final int CALL_AMOUNT = 1000000;       final ReflexiveInvocation ri = new ReflexiveInvocation();       int idx = 0;       // Call the method without using reflection.       long millis = System.currentTimeMillis();       for (idx = 0; idx < CALL_AMOUNT; idx++) {         ri.getValue();       }       System.out.println("Calling method " + CALL_AMOUNT + " times programatically took "           + (System.currentTimeMillis() - millis) + " millis");       // Call while looking up the method in each iteration.       Method md = null;       millis = System.currentTimeMillis();       for (idx = 0; idx < CALL_AMOUNT; idx++) {         md = ri.getClass().getMethod("getValue", null);         md.invoke(ri, null);       }       System.out.println("Calling method " + CALL_AMOUNT + " times reflexively with lookup took "           + (System.currentTimeMillis() - millis) + " millis");       // Call using a cache of the method.       md = ri.getClass().getMethod("getValue", null);       millis = System.currentTimeMillis();       for (idx = 0; idx < CALL_AMOUNT; idx++) {         md.invoke(ri, null);       }       System.out.println("Calling method " + CALL_AMOUNT + " times reflexively with cache took "           + (System.currentTimeMillis() - millis) + " millis");     } catch (final NoSuchMethodException ex) {       throw new RuntimeException(ex);     } catch (final InvocationTargetException ex) {       throw new RuntimeException(ex);     } catch (final IllegalAccessException ex) {       throw new RuntimeException(ex);     }   }   /**    * Getter for property value.    *     * @return Value of property value.    */   public String getValue() {     return this.value;   } } /* ########## End of File ########## */