今天华清Java学院小编要和大家分享的Java开发知识是Cglib动态代理,并提供了一个简单的Cglib动态代理实例。
Cglib动态代理是什么呢?
代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层。JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理。JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的继承的类,该怎么办?所以才出现了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();
}}
热点新闻