- 在java动态代理机制中有两个很重要的接口,一个就是java.lang.reflect.InvocationHandler,另一个就是java.lang.reflect.Proxy。首先介绍下这两个接口的作用和参数。
- 大概意思是每个动态代理类都要实现InvocationHandler接口,并且关联到一个handler,通过代理对象调用时,这个接口的方法调用就会转接到该handler的invoke方法进行调用。
- invoke方法
- proxy,该参数是代理的真实对象
- method,该参数是代理的方法
- 代理方法中接受的参数
- Proxy这个接口:
- 静态 方法获取代理对象
- 第一个参数是需要代理的对象的classloader
- 第二个参数是:需要代理对象的一组接口,代理之后,就可以调用这一组接口中的方法了
- 第三个参数:是InvocationHandler表示关联到哪个Handler上
案例
- 定义需要被代理的接口
- 定义需要被代理的实现类
- 定义代理类,必须实现InvocationHandler接口
import java.lang.invoke.MethodHandleInfo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
private Object realObject;
private Object proxyObject;
public MyInvocationHandler(Object reObject) {
super();
this.realObject = reObject;
this.proxyObject = Proxy.newProxyInstance(realObject.getClass().getClassLoader(),
realObject.getClass().getInterfaces(), this);
}
public Object getProxyObject() {
return proxyObject;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("在代理方法之前执行了");
method.invoke(realObject, args);
System.out.println("在代理方法之后执行了");
return null;
}
}
import org.junit.Test;
public class ProxyTest {
@Test
public void test1() {
MyInterfaceImp myInterfaceImp = new MyInterfaceImp();
MyInvocationHandler handler = new MyInvocationHandler(myInterfaceImp);
MyInterface proxy = (MyInterface) handler.getProxyObject();
String say2 = proxy.say2();
System.out.println(say2);
}
}
- 结果: