Java 反射与cglib.proxy与cglib.beanmap与直接赋值 性能对比
2014-08-28 15:40
736 查看
出处:http://www.cnblogs.com/zc22/archive/2010/06/20/1761332.html
测试代码:
代码
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Date;
import net.sf.cglib.beans.BeanMap;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class TestPerformance
{
public static void main(String[] args)
{
int times = 10000000;
// TestBean(times);//=15
// TestCglib(times);//=516
// TestBeanMap(times);//=256
TestReflection(times);// =11359
}
public static void TestBean(int times)
{
MyBean bean = new MyBean();
Date start = Calendar.getInstance().getTime();
for (int i = 0; i < times; i++)
{
bean.setName("helloworld");
Object v = bean.getName();
}
Date end = Calendar.getInstance().getTime();
System.out.println(end.getTime() - start.getTime());
}
public static void TestCglib(int times)
{
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MyBean.class);
enhancer.setCallback(new TestMethodInterceptorImpl());
MyBean my = (MyBean) enhancer.create();
Date start = Calendar.getInstance().getTime();
for (int i = 0; i < times; i++)
{
my.setName("helloworld");
Object v = my.getName();
}
Date end = Calendar.getInstance().getTime();
System.out.println(end.getTime() - start.getTime());
}
public static void TestBeanMap(int times)
{
MyBean bean = new MyBean();
BeanMap map = BeanMap.create(bean);
Date start = Calendar.getInstance().getTime();
for (int i = 0; i < times; i++)
{
map.put(bean, "name", "helloworld");
Object v = bean.getName();
}
Date end = Calendar.getInstance().getTime();
System.out.println(end.getTime() - start.getTime());
}
public static void TestReflection(int times)
{
MyBean bean = new MyBean();
Class c = MyBean.class;
try
{
Method get = c.getDeclaredMethod("getName", null);
Method set = c.getDeclaredMethod("setName", String.class);
Date start = Calendar.getInstance().getTime();
for (int i = 0; i < times; i++)
{
set.invoke(bean, "helloworld");
Object v = get.invoke(bean, null);
}
Date end = Calendar.getInstance().getTime();
System.out.println(end.getTime() - start.getTime());
} catch (Exception ex)
{
}
}
}
class TestMethodInterceptorImpl implements MethodInterceptor
{
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable
{
return proxy.invokeSuper(obj, args);
}
}
class MyBean
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
测试结果:
直接赋值 = 15
cglib.proxy = 516
cglib.beanmap = 256
reflection = 11359
测试代码:
代码
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Date;
import net.sf.cglib.beans.BeanMap;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class TestPerformance
{
public static void main(String[] args)
{
int times = 10000000;
// TestBean(times);//=15
// TestCglib(times);//=516
// TestBeanMap(times);//=256
TestReflection(times);// =11359
}
public static void TestBean(int times)
{
MyBean bean = new MyBean();
Date start = Calendar.getInstance().getTime();
for (int i = 0; i < times; i++)
{
bean.setName("helloworld");
Object v = bean.getName();
}
Date end = Calendar.getInstance().getTime();
System.out.println(end.getTime() - start.getTime());
}
public static void TestCglib(int times)
{
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MyBean.class);
enhancer.setCallback(new TestMethodInterceptorImpl());
MyBean my = (MyBean) enhancer.create();
Date start = Calendar.getInstance().getTime();
for (int i = 0; i < times; i++)
{
my.setName("helloworld");
Object v = my.getName();
}
Date end = Calendar.getInstance().getTime();
System.out.println(end.getTime() - start.getTime());
}
public static void TestBeanMap(int times)
{
MyBean bean = new MyBean();
BeanMap map = BeanMap.create(bean);
Date start = Calendar.getInstance().getTime();
for (int i = 0; i < times; i++)
{
map.put(bean, "name", "helloworld");
Object v = bean.getName();
}
Date end = Calendar.getInstance().getTime();
System.out.println(end.getTime() - start.getTime());
}
public static void TestReflection(int times)
{
MyBean bean = new MyBean();
Class c = MyBean.class;
try
{
Method get = c.getDeclaredMethod("getName", null);
Method set = c.getDeclaredMethod("setName", String.class);
Date start = Calendar.getInstance().getTime();
for (int i = 0; i < times; i++)
{
set.invoke(bean, "helloworld");
Object v = get.invoke(bean, null);
}
Date end = Calendar.getInstance().getTime();
System.out.println(end.getTime() - start.getTime());
} catch (Exception ex)
{
}
}
}
class TestMethodInterceptorImpl implements MethodInterceptor
{
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable
{
return proxy.invokeSuper(obj, args);
}
}
class MyBean
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
测试结果:
直接赋值 = 15
cglib.proxy = 516
cglib.beanmap = 256
reflection = 11359
相关文章推荐
- Java 反射与cglib.proxy与cglib.beanmap与直接赋值 性能对比
- 《partner4java 讲述 java基础》之第一步:list 、set 、map 粗浅性能对比分析
- java读取xml获得list并通过反射赋值给javabean
- 利用java反射实现两个具有相同属性bean赋值
- Java中Bean对象根据属性名称获取和设置其值和Map的性能
- 转 利用java反射实现两个具有相同属性bean赋值
- 函数直接调用与反射性能对比
- java基于反射的Map转Bean的工具类
- Java反射 - 简单的给Bean赋值和取值
- Java的动态性支持学习四 - 反射调用的性能对比
- 关于在Java使用反射对属性取值和赋值的性能问题。
- 利用Java的反射机制实现Bean实体与Map自动转换的工具类
- C#直接赋值和反射赋值(无GC)的性能比较
- Java不同的反射方式性能对比
- java基于反射的Map转Bean的工具类
- 利用java反射实现两个具有相同属性bean赋值
- 《partner4java 讲述 java基础》之第一步:list 、set 、map 粗浅性能对比分析
- BeanUtils和Cglib的Java Bean属性copy功能的性能比较
- 替换map的key并通过反射给实体类赋值(做接口或对比字段常用到)
- Java_性能优化_推荐使用String直接量赋值