1. Introduction of dynamic proxy
package cn2; public interface IUserDAO { /** * 登录方法 */ public void login(); /** * 注册方法 */ public void register(); } package cn2; public class UserDAOImpl implements IUserDAO { @Override public void login() { System.out.println("用户登录"); } @Override public void register() { System.out.println("用户注册"); } } package cn2; public class Test { public static void main(String[] args) { IUserDAO dao = new UserDAOImpl(); dao.register(); dao.login(); } }
User registration
User login
If I want to add permission verification and logging to each method, then the code implementation is as follows:
package cn2; public interface IUserDAO { /** * 登录方法 */ public void login(); /** * 注册方法 */ public void register(); } package cn2; public class UserDAOImpl implements IUserDAO { @Override public void login() { System.out.println("用户登录"); } @Override public void register() { System.out.println("用户注册"); } } package cn2; public class UserDAOImpl2 implements IUserDAO { private void actionCheck(){ System.out.println("权限检查"); } private void record(){ System.out.println("日志记录"); } @Override public void login() { this.actionCheck(); System.out.println("登录"); this.record(); } @Override public void register() { this.actionCheck(); System.out.println("注册"); this.record(); } } package cn2; public class Test { public static void main(String[] args) { IUserDAO dao = new UserDAOImpl2(); dao.register(); dao.login(); } }
Permission check
Registration
Logging
Permission check
Login
Logging
Why do you need to write a separate class to implement the interface and add permission verification and logging? Because when we design, we must ensure the principle of developing extended functions and closing code modifications. I defined a new class to implement the interface, just to extend the functions of the original interface instead of modifying the original implementation class.
However, it would be terrible to design it like this. If the requirements change, we will need to define many implementation classes, which is too complicated. what to do?
In life, we will encounter many problems, such as: I want to rent a house, but I don’t know the landlord, what should I do? Find an agent. In the same way, if I don’t want to modify the code to add permission checking and logging functions, can I just find a proxy object to help me implement it?
Dynamic proxy: This object is generated during the running of the program.
In Java, a Proxy class and an InvocationHandler interface are provided under the java.lang.reflect package. By using this class and interface, dynamic proxy objects can be generated. JDK only acts as a proxy for interfaces.
Methods in the Proxy class create dynamic proxy objects
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
The method of InvocationHandler will eventually be called
Object invoke(Object proxy,Method method,Object[] args)
package cn2; public interface IUserDAO { /** * 登录方法 */ public void login(); /** * 注册方法 */ public void register(); } package cn2; public class UserDAOImpl implements IUserDAO { @Override public void login() { System.out.println("用户登录"); } @Override public void register() { System.out.println("用户注册"); } } package cn2; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } /** *返回动态代理对象 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("权限检查"); Object invoke = method.invoke(target, args); System.out.println("日志记录"); return invoke; } } package cn2; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { //使用动态代理之前 IUserDAO dao = new UserDAOImpl(); dao.register(); dao.login(); System.out.println("-------------------"); //使用动态代理之后 IUserDAO proxy = (IUserDAO)Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new MyInvocationHandler(dao)); proxy.register(); proxy.login(); } }
User registration
User login
---------- ---------
Permission check
User registration
Logging
Permission check
User login
Logging