Java实现动态代理

来源:互联网 发布:json串转json对象 编辑:程序博客网 时间:2024/06/06 01:15
Java动态代理创建对象的过程:
1、通过实现InvocationHandler接口创建自己的调用处理器 MyIvocationHandler;
2、通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类;
3、通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型;
4、通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入。
为了简化对象创建过程,Proxy类中的newInstance方法封装了2~4,只需两步即可完成代理对象的创建。

以下为详细代码实现:

1、实现自己的InvocationHandler

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 实现自己的InvocationHandler * @author hang.shao * */public class MyInvocationHandler implements InvocationHandler {//目标对象private Object target;/** * 构造方法 */public MyInvocationHandler(Object target){super();this.target = target;}/** * 执行目标对象的方法 */public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{//在目标对象的方法执行前打印一下System.out.println("------before------");//执行目标对象的方法Object result = method.invoke(target, args);//在目标对象的方法执行后打印一下System.out.println("------after------");return result;}/** * 获取目标对象的代理对象 */public Object getProxy(){return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),           target.getClass().getInterfaces(), this);  }}
2、目标对象的接口

/** * 目标对象实现的接口,用JDK生成代理对象一定要实现一个接口 * @author hang.shao * */public interface UserService {//目标方法public abstract void add();}
3、目标对象接口实现类

/** * 目标对象接口实现类 * @author hang.shao */public class UserServiceImpl implements UserService {public void add(){System.out.println("------add------");}}
4、动态代理测试类

import org.junit.Test;/** * 动态代理测试类 * @author hang.shao * */public class ProxyTest {@Test      public void testProxy() throws Throwable {          // 实例化目标对象          UserService userService = new UserServiceImpl();          // 实例化InvocationHandler          MyInvocationHandler invocationHandler = new MyInvocationHandler(userService);          // 根据目标对象生成代理对象          UserService proxy = (UserService) invocationHandler.getProxy();          // 调用代理对象的方法          proxy.add();      }  }
结果如下所示


1 0
原创粉丝点击