动态代理
使用jdk基于接口的动态代理
1、定义接口
public interface UserService {
void add();
void delete();
void update();
void query();
}
2、真是对象
public class UserServiceImpl implements UserService{
@Override
public void add() {
System.out.println("添加一个用户");
}
@Override
public void delete() {
System.out.println("删除一个用户");
}
@Override
public void update() {
System.out.println("修改一个用户");
}
@Override
public void query() {
System.out.println("查询一个用户");
}
}
3、动态代理调用程序
/**
* 每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法。
*/
public class ProxyInvocationHandler implements InvocationHandler {
// 需要代理的对象
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public Object getProxy() {
// 获得代理对象
Object o = Proxy.newProxyInstance(this.getClass().getClassLoader(), userService.getClass().getInterfaces(), this);
return o;
}
// 处理代理实例上的方法调用并返回结果。
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log();
Object result = method.invoke(userService, args);
return result;
}
public void log() {
System.out.println("输出日志");
}
}
4、测试
public class Client {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl(); // 真是对象
ProxyInvocationHandler pih = new ProxyInvocationHandler(); // 调用处理程序
pih.setUserService(userService); // 设置需要代理的对象
UserService proxy = (UserService) pih.getProxy(); // 获取代理对象
proxy.add(); // 通过代理进行交互
}
}
万能模板
1、万能动态代理调用程序
/**
* 每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法。
*/
public class ProxyInvocationHandler implements InvocationHandler {
// 需要代理的对象
private Object target;
public void setUserService(Object target) {
this.target = target;
}
public Object getProxy() {
// 获得代理对象
Object o = Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return o;
}
// 处理代理实例上的方法调用并返回结果。
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log();
Object result = method.invoke(target, args);
return result;
}
public void log() {
System.out.println("输出日志");
}
}
2、测试
public class Client {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl(); // 真是对象
ProxyInvocationHandler pih = new ProxyInvocationHandler(); // 调用处理程序
pih.setUserService(userService); // 设置需要代理的对象
UserService proxy = (UserService) pih.getProxy(); // 获取代理对象
proxy.add(); // 通过代理进行交互
}
}
3、使用万能模板,不用修改其他代码,只要是继承了改接口,都可以用改调用程序动态生成代理对象。