1、 CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。 2、 用CGlib生成代理类是目标类的子类。 3、 用CGlib生成 代理类不需要接口 4、 用CGLib生成的代理类重写了父类的各个方法。 5、 拦截器中的intercept方法内容正好就是代理类中的方法体
代码
// 定义接口
public interface FooDao {
void doSomething();
}
// 定义实现
static class FooDaoImpl implements FooDao{
@Override
public void doSomething() {
System.out.println("Impl....");
}
}
static class FooProxyCjlib implements MethodInterceptor {
private Object target;
// 持有被代理对象
public FooProxyCjlib(Object target) {
this.target = target;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("before");
Object invoke = method.invoke(target, objects);
System.out.println("after");
return invoke;
}
}
public static void main(String[] args) {
// 原服务
FooDao fooDao = new FooDaoImpl();
// 代理服务
FooProxyCjlib cjLibProxySubject = new FooProxyCjlib(fooDao);
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(fooDao.getClass());
enhancer.setCallback(cjLibProxySubject);
FooDao proxyDao = (FooDao) enhancer.create();
// 打印原服务类名
System.out.println(fooDao.getClass().getName());
// 原服务输出
fooDao.doSomething();
System.out.println("-------");
// 打印代理服务类名
System.out.println(proxyDao.getClass().getName());
// 代理服务执行
proxyDao.doSomething();
System.out.println("-------");
}
输出结果:
cn.nzcong.xxxxxx.xxxxxx$FooDaoImpl
Impl....
-------
cn.nzcong.xxxxxx.xxxxxx$FooDaoImpl$$EnhancerByCGLIB$$3d31426d
before
Impl....
after
-------
全部评论