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底层原理(动态代理)”

spring5:AOP操作

什么鬼?弃用JDK动态代理,Spring5 默认使用 CGLIB 了?

[Spring5]AOP底层原理

Spring5 AOP 学习笔记

Spring5 代理设计模式的实现原理