cglib动态代理

cglib动态代理的优点是可以代理类,无需接口.

但是也有缺点,因为原理是生成子类代理,所以带final修饰符的方法无法被代理


AOPTest.zip附件包含 反射例子,静态代理,jdk动态代理,cglib动态代理,以及所需的jar包



以下是测试代码


//Cat.java
package com.memorycat.aoptest.cglib;

public class Cat {

	void eat(String food) {
		System.out.println("猫吃" + food);
	}

	String type() {
		System.out.println("Cat - String type()");
		return "猫科动物";
	}

	final void sleep() {
		// 注意,这个带final修饰词的方法不会被代理,因为final不能被子类重写
		System.out.println("MemoryCat拍着睡觉的");
	}
}


//CatMethodInterceptor.java
package com.memorycat.aoptest.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CatMethodInterceptor implements MethodInterceptor {

	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		// TODO Auto-generated method stub

		System.out.println("******这是调用方法前加入自己的代码");
		Object retObj = proxy.invokeSuper(obj, args);
		System.out.println("######这是调用方法后加入自己的代码");
		System.out.println();
		return retObj;
	}

}
//测试代码
package com.memorycat.aoptest.cglib;

import net.sf.cglib.proxy.Enhancer;

public class Tester {
	public static void main(String[] args) {

		Cat cat = (Cat) Enhancer.create(Cat.class, new CatMethodInterceptor());

		cat.eat("牛奶");
		System.out.println("猫是" + cat.type());
		cat.sleep();
	}
}
最后是运行结果



******这是调用方法前加入自己的代码
猫吃牛奶
######这是调用方法后加入自己的代码

******这是调用方法前加入自己的代码
Cat - String type()
######这是调用方法后加入自己的代码

猫是猫科动物
MemoryCat拍着睡觉的


评论列表