问题:我们有一个实现类,分别有添加、删除、更新、查询等方法,如果我们现在要在执行方法加一个验证权限的方法,我们该如何做呢?有人会这还不简单,新建一个方法,在每个方法前调用一个就行。这种是可以完成功能,但它不够灵活,也破坏了我们的原有的代码。那该如何做才能更灵活呢?我们现在用jdk提供的动态代理模式来实现。
首先,我们新建一个接口UserManager
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
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,生成我们实现类的代理类,我们将在这个加上验证权限的方法。
public class SecurityHandler implements InvocationHandler {
private Object targetObject;
public Object newProxy(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance (targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); }
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { checkSecurity(); Object ret = null; try { ret = method.invoke(this.targetObject, args); }catch(Exception e) { e.printStackTrace(); throw new java.lang.RuntimeException(e); } return ret; }
private void checkSecurity() { System.out.println("----------checkSecurity()------------"); }
} |
最后,我们写一个测试类来进行测试一下。
public class Client { public static void main(String[] args) { SecurityHandler handler = new SecurityHandler(); UserManager userManager = (UserManager)handler.newProxy(new UserManagerImpl()); userManager.deleteUser(1); } } |