目标对象: 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); } }