当前位置: 移动互联网学院 > Java培训 > JAVA开发 > Cglib动态代理实例
Cglib动态代理实例 时间:2017-08-29     来源:华清远见JAVA学院

今天华清Java学院小编要和大家分享的Java开发知识是Cglib动态代理,并提供了一个简单的Cglib动态代理实例。

Cglib动态代理是什么呢?

代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层。JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理。JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的继承的类,该怎么办?所以才出现了Cglib动态代理。接下来我们来看一个Cglib动态代理实例。

Cglib动态代理示意图

基于类实现的Cglib动态代理实例

1.定义一个实现类 即和核心类

public class Dao {

public void update() {

System.out.println("PeopleDao.update()");

}

public String select() {

System.out.println("PeopleDao.select()");

return "hello,world";

}}

2 .定义一个回调

该回调必须 MethodInterceptor

public class DaoProxy implements MethodInterceptor {

@Override

public Object intercept(Object object, Method method, Object[] objects, MethodProxy proxy) throws Throwable {

System.out.println("Before Method Invoke");

Object obj = proxy.invokeSuper(object, objects);

System.out.println("After Method Invoke");

return obj;

}}

3.定义一个 filter

该filter 必须实现 CallbackFilter

public class DaoFilter implements CallbackFilter {

@Override

public int accept(Method method) {

if ("select".equals(method.getName())) {

return 0;

}

return 1;

}}

4.使用

public class MyClass {

public static void main(String[] args){

DaoProxy daoProxy = new DaoProxy();

DaoProxy daoAnotherProxy = new DaoProxy();

Enhancer enhancer = new Enhancer();

enhancer.setSuperclass(Dao.class);

enhancer.setCallbacks(new Callback[]{daoProxy, daoAnotherProxy, NoOp.INSTANCE});

enhancer.setCallbackFilter(new DaoFilter());

Dao dao = (Dao)enhancer.create();

dao.update();

dao.select();

}}

X