Home  >  Article  >  Java  >  java dynamic proxy

java dynamic proxy

高洛峰
高洛峰Original
2016-12-01 13:30:521272browse

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


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:Java Queue usage summaryNext article:Java Queue usage summary