java动态代理

来源:互联网 发布:下载cctv网络电视 编辑:程序博客网 时间:2024/06/05 10:08
 在目前的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 {@Overridepublic void addUser() {// TODO Auto-generated method stubSystem.out.println("--addUser()--");}@Overridepublic boolean delUser(int id) {// TODO Auto-generated method stubSystem.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);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {   //具体的处理策略 根据方法名判断// TODO Auto-generated method stubcheck();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 stubProxyHandler handler = new ProxyHandler();UserManager userManager = (UserManager)handler.createProxy(new UserManagerImpl());userManager.addUser();userManager.delUser(1);}}