准备工作: 1:写个IAnimal接口 [Dog、Cat实现IAnimal接口]、Student类 2:引入cglib的jar包com.springsource.net.sf.cglib-2.2.0.jar 一:使用JDK类 1:要实现动态代理机制实现InvocationHandler接口,里边加属性及构造方法【方法传入任何实现类】 2:会覆盖方法 3:写个ProxyFactory 里边定方法 public static Object createProxyObject(MyProxy proxy){ ==============================测试: IAnimal dog = (IAnimal) ProxyFactory.createProxyObject(new MyProxy(new Dog())); 二:使用CGLib类 1:写个CGlibProxy类实现MethodInterceptor覆盖方法 @Override 2:写个ProxyFactory类 写个方法及属性 static CGLibProxy proxy = new CGLibProxy();
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
long start = System.currentTimeMillis();
try{
return method.invoke(target, args);
}finally{
long end = System.currentTimeMillis();
System.out.println("方法["+method.getName()+" ]执行时间"+(end-start)+"ms");
}
}
Object target = proxy.getTarget();
//Proxy类专门完成代理类的操作类,可以通过此类为一个或多个接口动态地生成
//实现类
//下面这句话,就是动态的生成实现类
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), proxy);
}
dog.play();
System.out.println(dog.getName());
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
long start = System.currentTimeMillis();
try{
return methodProxy.invokeSuper(obj, args);//这里不是invokeSuper的话,会出现栈溢出
}finally{
long end = System.currentTimeMillis();
System.out.println("方法[" + methodProxy + "]执行时间为 : " + (end-start) + "ms.");
}
}
public static Object createProxyObject(Object obj){
//return Enhancer.create(obj.getClass(), proxy);//与下面是等同的
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(obj.getClass());
enhancer.setCallback(proxy);
return enhancer.create();
}
Spring的二种动态代理
最新推荐文章于 2025-06-22 09:11:27 发布