【Java】jdk动态代理
一,概述
jdk动态代理,指通过Proxy.newProxyInstance方法回来的实例对象,通过InvokeHandler接口实现切片编程的方式。
此为代理模式,能在不改变原类的基础上,对类实现前置、后置增强,最小化嵌入功能逻辑,实现解耦。
注意,此方式只能代理实现接口的类,它的实现原理是生成一个接口简单实例类的字节码,通过ClassLoader.defin方法解析生成的字节码,得到一个Proxy Class。
二,实例
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyMain {//接口定义public interface IAction {int action(String type);}public static class ActionImpl implements IAction {@Overridepublic int action(String type) {System.out.println("type=" + type);return 0;}}public static void main(String[] args) {ActionImpl action = new ActionImpl();IAction proxyInstance = (IAction) Proxy.newProxyInstance(action.getClass().getClassLoader(), new Class[]{IAction.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.getName().equals("action")) {//前置增强System.out.println("before fly");//原类逻辑int result = action.action((String) args[0]);//后置增强System.out.println("after fly");return result;}return null;}});//代理方法proxyInstance.action("fly");}
}
输出
三,原理
跟进Proxy.newProxyInstance方法查看,
1,返回一个构造器,此处已经生成了对应Stub Class,因此该方法内部有字节码生成逻辑,
2,通过构造器反射创建一个实例,
跟进getProxyConstructor
享元模式设计,缓存对象。
随后,通过ProxyBuilder的build方法,生成一个构造器,跟进
1,生成了一个Class,
2,根据方法参数返回一个构造器
跟进defineProxyClasss
1,通过ProxyGenerator方法,生成字节码,
2,通过字节码生成一个Class,
跟进generatorProxyClass
1,hashcode,equals,toString方法生成
2,接口方法生成
关于字节码生成的具体过程,本文不再跟进。以上,即jdk动态代理实现的原理。