代理模式就是为了提供额外或不同的操作,而插入的用来替代实际对象的对象,这些操作涉及到与实际对象的通信,因此代理通常充当中间人角色
一、java动态代理
java动态代理可以动态地创建代理并动态地处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上。
1、使用动态代理的五大步骤
(1)编写接口类和实现类
public interface UserDao {
void addUser(String var1);
}
public class UserDaoImpl implements UserDao{
@Override
public void addUser(String userName) {
System.out.println("添加用户"+userName);
}
}
(2)通过实现InvocationHandler接口来自定义自己的InvocationHandler(主要是编写invoke方法)
public class LogHandler implements InvocationHandler {
private Object target;
public LogHandler(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始记录日志");
method.invoke(target,args);
System.out.println("结束记录日志");
return null;
}
}
(3)使用Proxy.newProxyInstance方法创建代理对象并执行方法
UserDao userDao = new UserDaoImpl();
//构造函数中传入实际对象
LogHandler logHandler = new LogHandler(userDao);
UserDao userDAOProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(),logHandler);
userDAOProxy.addUser("aaa");
2、java动态代理的原理解析
java动态代理的核心是Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)。用于生成代理对象。
ClassLoader loader:用来指明生成代理对象使用哪个类装载器。
Class<?>[] interfaces:用来指明生成哪个对象的代理对象(代理类和目标类需要实现相同的接口)
InvocationHandler h:最后会调用到我们自定义的方法中。
3、newProxyInstance方法生成代理对象过程
(1)通过Proxy.getProxyClass(ProxyGenerator.generateProxyClass(proxyName, interfaces))获得动态代理类的class字节码内容。
(2)把字节码通过传入的类加载器加载到虚拟机中,然后通过反射机制获得代理类的构造方法(方法签名为getConstructor(InvocationHandler.class)),生成代理类对象