动态代理使用
interface UserService{
void login(User user);
void register(User user);
}
class UserServiceImpl implements UserService {
@Override
void register(User user) {
// 这里是原本的基础业务实现
}
@Override
void login(User user) {
// 这里是原本的基础业务实现
}
}
class UserServiceInterceptor implements InvocationHandler {
private Object realObj;
public UserServiceInterceptor(Object realObj) {
super();
this.realObj = realObj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(args != null && args.length > 0 && args[0] instanceof User) {
// 无侵入式增加代码
if(user.getName().getPassword().length() <= 6 && method.getName().equals("login")) {
throw new RuntimeException("密码长度必须大于6");
}
Object result = method.invoke(realObj, args);
return result;
}
}
}
// 如何使用
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
InvocationHandler userServiceInterceptor = new UserServiceInterceptor(userService);
UserService userServiceProxy = Proxy.newProxyInstance(userService.getClass().getClassLoader, userService.getClass().getInterfaces(), userServiceInterceptor);
// 使用时直接通过userServiceProxy进行调用
userServiceProxy.login(new User());
}
使用很简单,就是熟悉下InvocationHandler Proxy.newProxyInstance。
InvocationHandler实现了无侵入式的增加被代理类的功能,Proxy.newProxyInstance利用传入参数,运行时动态生成被代理类的实际对象(如何利用传入参数生成对象,涉及的知识点是类加载过程)。
在本人看来,动态代理最大的用处就是上面的加黑斜体:无侵入式的增加被代理类的功能。