码迷,mamicode.com
首页 > 其他好文 > 详细

Cglib代理

时间:2015-12-17 15:56:48      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

目标对象:
package com.bj.daili;

public class UserServiceImpl {

    public final void saveUser(String username, String password) {
        System.out.println("保存用户【"+username+"】,密码是【"+password+"】");
    }

    public void updateUser(String username, String password) {
        System.out.println("更新用户【"+username+"】,密码是【"+password+"】");
    }

    public void deleteUser(String username) {
        System.out.println("删除用户【"+username+"】");
    }

    public String findUser() {
        System.out.println("查询用户,返回王老五");
        return "王老五";
    }

    
}


代理对象:
package com.bj.daili;

import java.lang.reflect.Method;

import org.springframework.cglib.core.Signature;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;


public class CglibProxy implements MethodInterceptor {
    
    //定义一个目标对象
    Object targetObject;

    public Object createProxyObject(Object targetObject) {
        this.targetObject = targetObject;
        //如何根据目标对象创建的cglib的代理对象呢?
        
        Enhancer enhancer = new Enhancer();
        enhancer.setClassLoader(this.targetObject.getClass().getClassLoader());
        enhancer.setSuperclass(this.targetObject.getClass());
        enhancer.setCallback(this);
        //创建cglib代理
        return enhancer.create();
    }
    
    /**
     * intercept:在访问目标对象之前先执行代理对象
     *   * Object proxy:代理对象
     *   * Method method:代理对象中执行的方法(目标的对象的方法对象)
     *   * Object[] args:方法中的参数
     *   * MethodProxy:方法的代理对象
     *   * 返回值Ojbect:可以指定目标对象方法的放回值
     * */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args,MethodProxy methodProxy) throws Throwable {
        if(method.getName()!=null && method.getName().contains("save") || method.getName().contains("update")){
            security();//执行校验
            System.out.println("代理对象的类:"+proxy.getClass());
            System.out.println("代理对象或目标对象的方法名称:"+method.getName());
            if(args!=null && args.length>0){
                for(Object o:args){
                    System.out.println("调用目标对象的方法参数:"+o);
                }
            }
        }
        //获取目标对象方法信息
        Signature signature = methodProxy.getSignature();
        System.out.println(signature.getName()+"   "+signature.getArgumentTypes()+"   "+signature.getReturnType());
        /**
         * method.invoke:调用目标对象
         * 参数一:目标对象
         * 参数二:调用目标对象的方法参数
         * 返回Object:调用目标对象的方法的返回值
         */
        Object o = method.invoke(targetObject, args);
        //如果返回null,客户端调用目标对象之后就都为null
        return o;
    }

    
    //校验
    public void security(){
        System.out.println("开始执行校验...。校验结束");
    }

    

}
  测试:
package com.bj.daili;

public class App {

    public static void main(String[] args) {
        CglibProxy cglibProxy = new CglibProxy();
        //使用createProxyObject的方法,传递目标对象,返回代理对象
        UserServiceImpl userService = (UserServiceImpl) cglibProxy.createProxyObject(new UserServiceImpl());
    
        userService.saveUser("李小四", "123");
        userService.updateUser("李小四", "123");
        userService.deleteUser("李小四");
        String value = userService.findUser();
        System.out.println("value:"+value);
    }
}

 

Cglib代理

标签:

原文地址:http://www.cnblogs.com/baijin05/p/5054171.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!