1.基于jdk的动态代理
@Test
public void test03(){//基于jdk的动态代理
//原始类
UserServiceImpl userService = new UserServiceImpl();
InvocationHandler invocationHandler=new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("------jdk log-----");
//调用原始类的方法
Object invoke = method.invoke(userService, args);
return invoke;
}
};
//创建动态代理对象 userService $proxy
UserService userService1 = (UserService) Proxy.newProxyInstance(TestProxy.class.getClassLoader(), userService.getClass().getInterfaces(), invocationHandler);
// System.out.println("userService1 = " + userService1);
User user = User.builder().password("123445").username("tom").build();
//invoke
userService1.add(user);
}
2.基于cglib的动态代理
@Test
public void test04(){ //基于cglib的动态代理 基于父子关系 创建代理对象
UserServiceImpl2 userServiceImpl2 = new UserServiceImpl2();
//Enhancer 它是一个字节码增强器,可以用来为无接口的类创建代理
Enhancer enhancer = new Enhancer();
//设置相关参数
enhancer.setClassLoader(this.getClass().getClassLoader());
enhancer.setSuperclass(userServiceImpl2.getClass());
//callback增强业务 类似jdk中的invoke方法
MethodInterceptor methodInterceptor = new MethodInterceptor(){
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("---------cglib------");
Object invoke = method.invoke(userServiceImpl2, objects);
return invoke;
}
};
enhancer.setCallback(methodInterceptor);
//通过enhancer 创建代理对象
UserServiceImpl2 userServiceImpl =(UserServiceImpl2) enhancer.create();
User user = User.builder().password("123445").username("tom").build();
userServiceImpl.add(user);
}



