滴水穿石Java动态代理

  动态代理类实现InvocationHandler接口,利用反射机制,动态地生成代理对象及其调用方法。提高了代码的可扩展性和可维护性,更加符合OCP原则。
继续使用《Java静态代理》中的实例。

UserManager.java

/**
* 定义UserManager接口,包含对用户增删改查四个抽象方法
 * @author Administrator
 *
 */
public interface UserManager {
    
   public void addUser(String username,String password);
   
    public void deleteUser(int id);
    
    public void modifyUser(int id,String username,String password);
    
    public String findUserById(int id);
}

UserManagerImpl.java

/**
 * 实现UserManager接口的具体类
 * @author Administrator
 *
 */
public class UserManagerImpl implements UserManager {
    public void addUser(String username, String password) {
        System.out.println("UserManagerImpl.addUser()...");
    }
    public void deleteUser(int id) {
        System.out.println("UserManagerImpl.deleteUser()...");
    }
    public String findUserById(int id) {
        System.out.println("UserManagerImpl.findUserById()...");
        return null;
    }
    public void modifyUser(int id, String username, String password) {
        System.out.println("UserManagerImpl.modifyUser()...");
    }
}

SecurityHandler.java---实现InvocationHandler接口。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class SecurityHandler implements InvocationHandler {
    private Object targetObject;
    
    public Object newProxy(Object targetObject) {
        this.targetObject = targetObject;
        //调用Proxy中的静态方法newProxyInstance()
        /**
         * loader - 定义代理类的类加载器
         * interfaces - 代理类要实现的接口列表
         * h - 指派方法调用的调用处理程序,即SecurityHandler类
         */
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                                    targetObject.getClass().getInterfaces(), this);
    }
    /**
     * proxy - 代理实例
     * method - 对应于在代理实例上调用的接口方法的 Method 实例。
     * args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数
     * 被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。
     */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        checkSecurity();
        Object ret = null;//接收调用方法的返回值
        try {
            ret = method.invoke(targetObject, args);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret;
    }
    
    private void checkSecurity(){
        System.out.println("SecurityHandler.checkSecurity()...");
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
        /*UserManager userManager = new UserManagerImpl();
        userManager.addUser("zhangsan", "111");*/
        UserManager userManager = (UserManager)new SecurityHandler().newProxy(
                new UserManagerImpl());
        userManager.addUser("zhangsan", "111");
    }
}

运行结果:
SecurityHandler.checkSecurity()...
UserManagerImpl.addUser()...

原文地址:https://www.cnblogs.com/nexiyi/p/2806372.html