Java的动态代理实例
首先写一个接口:
package net.test.dynamicproxy;public interface UserManager { public void addUser(String username,String password); public void deleteUser(String id);}?
然后写这个接口的实现类:
package net.test.dynamicproxy;public class UserManagerImpl implements UserManager { @Override public void addUser(String username, String password) { System.out.println("增加的用户名:"+username+" 密码:"+password); } @Override public void deleteUser(String id) { System.out.println("删除用户"); }}然后再写一个代理类,这个类实现了InvocationHandler接口:package net.test.dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class UserManagerHandler implements InvocationHandler { private Object targetObject;//表示代理实例 /***返回一个代理实例*/ public Object newProxy(Object targetObject){ this.targetObject = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); }/***这个代理类被实例化后会自动调用这个invoke(..)方法*/ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { checkRole(); Object returnValue = null; try{ method.invoke(targetObject, args);//这个方法必须要写,否则就无法实现代理,表示调用代理类的方法 }catch(RuntimeException e){ System.out.println(e); } return null; } public void checkRole(){ System.out.println("--------------检查权限-------"); }}?
测试:
package net.test.dynamicproxy;public class Client { public static void main(String args[]){ UserManagerHandler handler = new UserManagerHandler(); UserManager manager = (UserManager)handler.newProxy(new UserManagerImpl()); manager.addUser("hahaha", "yyd"); manager.deleteUser("110"); }}?
运行结果:
--------------检查权限-------
增加的用户名:hahaha 密码:yyd
--------------检查权限-------
删除用户