动态代理类实现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()...