滴水穿石--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()...

你可能感兴趣的:(java动态代理)