java动态代理
在目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。
其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。
Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现
业务接口
package com.itmyhome.manager; public interface UserManager { public void addUser(); //增加用户 public boolean delUser(int id); //删除用户 }
业务接口实现
package com.itmyhome.manager; //UserManager接口的实现类 public class UserManagerImpl implements UserManager { @Override public void addUser() { // TODO Auto-generated method stub System.out.println("--addUser()--"); } @Override public boolean delUser(int id) { // TODO Auto-generated method stub System.out.println("--delUser()--"); return true; } }
InvocationHandler实现 测试在调用接口方法前输出一行代码
package com.itmyhome.manager; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyHandler implements InvocationHandler { private Object obj; //要代理的对象 public Object createProxy(Object obj){ //创建代理 this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //具体的处理策略 根据方法名判断 // TODO Auto-generated method stub check(); Object temp = method.invoke(this.obj, args); return temp; } public void check(){ System.out.println("---check()---"); } }
测试代码
package com.itmyhome.manager; public class Client { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ProxyHandler handler = new ProxyHandler(); UserManager userManager = (UserManager)handler.createProxy(new UserManagerImpl()); userManager.addUser(); userManager.delUser(1); } }