A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© shi0000 中级黑马   /  2014-5-2 19:08  /  885 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

3、将CGLIB再做一个简单的包装:

class CglibProxy implements MethodInterceptor{
    private Object srcTarget;
    private CglibProxy(Object o){
       this.srcTarget = o;
    }
    @SuppressWarnings("unchecked")
    public static <T>T proxyTarget(T t){
       Enhancer en = new Enhancer();
       en.setSuperclass(t.getClass());
       en.setCallback(new CglibProxy(t));
       T tt = (T) en.create();
       return tt;
    }
    @Override
    public Object intercept(Object obj, Method method, Object[] args,
           MethodProxy proxy) throws Throwable {
       System.err.println("拦截前...");
       Object o = method.invoke(srcTarget, args);
       System.err.println("拦截后....");
       return o;
    }
}
包装以后的调用代码如下,主要是快速的实现获取被代理类:
        Person p = CglibProxy.proxyTarget(new Person());
       p.sayHi("HJello");
       IAnimal dog = CglibProxy.proxyTarget(new Dog());
       dog.eat();
4、使用静态方法代理一个没有接口的对象
以下代码,包含在一个测试方法或是main方法中运行:
       final Person src = new Person();
        //直接使用静态方法代理一个对象
       Person p = (Person) Enhancer.create(Person.class,new MethodInterceptor(){
           public Object intercept(Object proxyedObj, Method method, Object[] args,
                  MethodProxy proxy) throws Throwable {
              System.err.println("Hello");
              //使用原生的方法调用,注意里面的src
              //Object oo = method.invoke(src, args);
              //使用MethodProxy调用父类的代码,同样有效
              Object oo = proxy.invokeSuper(proxyedObj, args);
              return oo;
           }
       });
       System.err.println(p.getClass());
       p.abc();

1 个回复

倒序浏览
谢谢分享,,,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马