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