在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。
举个例子:
定义个普通接口
package com.yaspeed.proxy;
public interface LoanApply {
void saveApplyInfo(String applyId);
}
定义一个需要代理的目标类
package com.yaspeed.proxy;
public class LoanApplyImpl implements LoanApply{
@Override
public void saveApplyInfo(String applyId) {
System.out.println("save()...");
}
}
下面我们实现代理类
package com.yaspeed.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 代理类
* @author wud
*
*/
public class LoanApplyProxy {
private LoanApply target;
public LoanApplyProxy(LoanApply target){
this.target = target;
}
public LoanApply getProxyInstance(){
LoanApply proxy = null;
//获取目标代理类的类加载器
ClassLoader loader = target.getClass().getClassLoader();
//获取代理类的Class对象
Class[] interfaces =new Class[]{LoanApply.class};
//当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用
InvocationHandler h = new InvocationHandler() {
/**
* proxy: 指代我们所代理的那个真实对象
* method: 指代的是我们所要调用真实对象的某个方法的Method对象
* args: 指代的是调用真实对象某个方法时接受的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("method方法被调用前。。。");
Object obj = method.invoke(target, args);
System.out.println("method方法被调用后。。。");
return obj;
}
};
proxy = (LoanApply) Proxy.newProxyInstance(loader, interfaces, h);
System.out.println(proxy.getClass().getName());
return proxy;
}
}
测试方法:
package com.yaspeed.proxy;
public class TestProxy {
public static void main(String[] args) {
LoanApply target = new LoanApplyImpl();
LoanApplyProxy proxy = new LoanApplyProxy(target);
target = proxy.getProxyInstance();
target.saveApplyInfo("1111");
}
}