动态代理
2018-01-17 本文已影响0人
jsjack_wang
1.使用reflect包中Proxy实现
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
loader: 类加载器,使用AppClassLoader加载器即可
interfaces: 委托类的所有接口
invocationHandler: 实现代理需要的一个接口
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
proxy:委托类
method: 调用的方法
args: 调用方法的参数
2.具体实现
2.1 User.java
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private String username;
private String password;
}
2.2 代理类和委托类都实现的接口
public interface IUserDao {
void saveUser(User user);
int updateUser(User user);
}
2.3 委托类(如果委托类没有实现接口 需要使用cglib实现动态代理)
public class UserDaoImpl implements IUserDao {
@Override
public void saveUser(User user) {
System.out.println("UserDaoImpl save user.");
}
@Override
public int updateUser(User user) {
System.out.println("UserDaoImpl update user.");
return 0;
}
}
2.4 代理类
public class UserDynamicsProxy<T> implements InvocationHandler {
private T target;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("proxy before.");
Object result = method.invoke(target, args);
System.out.println("proxy after");
return result;
}
public T proxy(T target) {
this.target = target;
return (T) Proxy.newProxyInstance(UserDynamicsProxy.class.getClassLoader(), target.getClass().getInterfaces(), this);
}
}
3.测试
@Test
public void testDynamicsProxy() {
User user = new User();
IUserDao userDao = new UserDaoImpl();
IUserDao proxyUserDao = new UserDynamicsProxy<IUserDao>().proxy(userDao);
proxyUserDao.saveUser(user);
}