问题
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
接口的实现类的相应方法。