1.什么是动态代理?
动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术
2.分类
3.角色分析
4.需要知道的两个类
Proxy:代理类 ProxyInvocationHandler:调用处理程序
5.代码示例
5.1被代理的接口
public interface UserService {
public void add();
public void delete();
public void update();
public void query();
}
5.2真实角色
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println("add方法");
}
@Override
public void delete() {
System.out.println("delete方法");
}
@Override
public void update() {
System.out.println("update方法");
}
@Override
public void query() {
System.out.println("query方法");
}
}
5.3ProxyInvocationHandler工具类生成代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//用这个类自动生成代理类
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.getClass().getInterfaces(), this);
}
//处理代理实例,并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质,就是使用反射机制实现
Log(method.getName());
Object result = method.invoke(userService, args);
return result;
}
public void Log(String msg){
System.out.println("执行了"+ msg+"方法");
}
}
5.4模拟客户端
package com.kuang.design.proxy.proxy;
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();
proxy.delete();
proxy.query();
proxy.update();
}
}
6.优势
7.ProxyInvocationHandler工具类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//用这个类自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {
//被代理的接口
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//生成得到代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
//处理代理实例,并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质,就是使用反射机制实现
Object result = method.invoke(target, args);
return result;
}
}