Java动态代理创建对象的过程:
1、通过实现InvocationHandler接口创建自己的调用处理器 MyIvocationHandler;
2、通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类;
3、通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型;
4、通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入。
为了简化对象创建过程,Proxy类中的newInstance方法封装了2~4,只需两步即可完成代理对象的创建。
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();
}
}
结果如下所示