importjava.lang.reflect.*;importnet.sf.cglib.proxy.*;importjava.text.*;importjava.util.concurrent.Callable;publicclassProxyPerformanceComparison {publicstaticvoidmain(String[] args)throwsException {
CallablejdkProxy=(Callable) java.lang.reflect.Proxy.newProxyInstance(
ClassLoader.getSystemClassLoader(),newClass[] { Callable.class},newJdkHandler(newCounter())
);
Enhancer enhancer=newEnhancer();
enhancer.setCallback(newCglibInterceptor(newCounter()));
enhancer.setInterfaces(newClass[] { Callable.class});
CallablecglibProxy=(Callable) enhancer.create();for(inti2=0; i2<10; i2++) {
iterate(jdkProxy,"JDK Proxy:");
iterate(cglibProxy,"CGLIB:");
System.err.println();
}
}staticfinalDecimalFormat format=newDecimalFormat();staticvoiditerate(Callablecallable, String label)throwsException {intcount=10000000;longtime=System.currentTimeMillis();inttotal=0;for(inti=0; i
total+=callable.call();
}
time=System.currentTimeMillis()-time;
System.err.println(label+format.format(count*1000/time)+"calls/s"); }/*inner class*/staticclassJdkHandlerimplementsjava.lang.reflect.InvocationHandler {finalObject delegate;
JdkHandler(Object delegate) {this.delegate=delegate;
}publicObject invoke(Object object, Method method, Object[] objects)throwsThrowable {returnmethod.invoke(delegate, objects);
}
}/*inner class*/staticclassCglibInterceptorimplementsMethodInterceptor {finalObject delegate;
CglibInterceptor(Object delegate) {this.delegate=delegate;
}publicObject intercept(Object object, Method method, Object[] objects, MethodProxy methodProxy)throwsThrowable {returnmethodProxy.invoke(delegate, objects);
}
}/*inner class*/staticclassCounterimplementsCallable{intcount=0;publicInteger call()throwsException {returncount++;
}
}
}