Spring5动态代理报错com.sun.proxy.$Proxy0 cannot be cast to com.gzh.demo02.UserService
Posted The Gao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring5动态代理报错com.sun.proxy.$Proxy0 cannot be cast to com.gzh.demo02.UserService相关的知识,希望对你有一定的参考价值。
问题
public class ProxyInvocationHandler implements InvocationHandler
private UserService userService;
public void setUserService(UserService userService)
this.userService = userService;
public Object getProxy()
return Proxy.newProxyInstance(this.getClass().getClassLoader(), UserService.class.getInterfaces(), this);
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
System.out.println("Proxy start~");
Object obj = method.invoke(userService, args);
System.out.println("Proxy end~");
return obj;
这里需要通过调用getProxy()
方法返回动态代理类的实例,这里我在调用newProxyInstance()
传参时,第二个参数要求传入@NotNull Class<?>[] interfaces,
,我传入的是UserService.class.getInterfaces()
,这里UserService是一个接口而不是一个实现类,因此会报错。
其实在创建这个InvocationHandler实现类时,通过Setter方法已经将一个UserService的实现类注入了。所以这里应该是userService.getClass().getInterfaces()
。
动态代理的本质
对于上述案例来说,ProxyInvocationHandler
类中有一个UserService
属性。创建ProxyInvocationHandler
对象时,通过setUserService
方法设置UserService
接口的实现类。getProxy()
方法实际上是创建了一个UserService
接口的一个实现类的实例对象,执行接口中的方法时会调用invoke()
方法,invoke()
方法会调用传入的通过setUserService
方法设置UserService
接口的实现类的相应方法。
以上是关于Spring5动态代理报错com.sun.proxy.$Proxy0 cannot be cast to com.gzh.demo02.UserService的主要内容,如果未能解决你的问题,请参考以下文章
Spring5学习笔记 — “Spring AOP底层原理(动态代理)”