public class Main { private final static LogWrapper log; static { // This is not a standard way to load a Logger, but wanted to see // in detail any issues that different JVM's might encounter. LogWrapper lw = null; try { lw = LogWrapper.getLogger( Main.class ); } catch ( Throwable t ) { t.printStackTrace(); } log = lw; } public static void main( String[] args ) throws Exception { System.out.println( "we have log object: " + ( log != null ) ); System.out.println( "we have log4j: " + LogWrapper.log4j ); LogWrapper.setBackupLogFile( "./dude.log" ); // warmup log.info( "hello!" ); // Is reflection on LogWrapper okay? java.lang.reflect.Method[] methods = log.getClass().getDeclaredMethods(); for ( int i = 0; i < methods.length; i++ ) { log.debug( methods[ i ] ); } // Is reflection on underlying LogHelper okay? (not okay if using // javac from Java 1.3! - bytecode is more strict about dependencies). methods = LogHelper.class.getDeclaredMethods(); for ( int i = 0; i < methods.length; i++ ) { log.fatal( methods[ i ] ); } System.gc(); // Time trial! long start = System.currentTimeMillis(); log.info( "hello!" ); // Is reflection on LogWrapper okay? methods = log.getClass().getDeclaredMethods(); for ( int i = 0; i < methods.length; i++ ) { log.debug( methods[ i ] ); } // Is reflection on underlying LogHelper okay? (not okay if using // javac from Java 1.3! - bytecode is more strict about dependencies). methods = LogHelper.class.getDeclaredMethods(); for ( int i = 0; i < methods.length; i++ ) { log.fatal( methods[ i ] ); } long end = System.currentTimeMillis(); System.out.println( end - start + "ms" ); } }