1.静动区别:
在静态代理中(Static Proxy),代理类是真实存在的,代理类在每次编译的时候都会生成一个.class字节码文件,所以说静态类所实现的接口和代理方法在编译的时候已经定好了
动态代理(Dynamic Proxy),动态的加载生成.class文件,在系统运行时动态的生成和加载
优点:无需为每个真实角色来创建一个形式完全一样的代理类,假如抽象接口中存在多个抽象方法,为每个方法写一个代理方法是很麻烦和消耗资源的,同样,我们后期的接口的改动和代码维护成本会大大增加,而且在动态代理中,一个代理角色代理多个真实角色,并代理多个方法
2.Java中的动态代理:
从JDK1.3开始,java就对动态代理提供了支持,在动态代理的机制中,需要利用lang包下的反射-java.lang.reflect中的InvocationHandler接口和Proxy首先我们的handler要去是实现InvocationHandler接口,并实现中的invoke方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
最重要的就是这个方法,它是用来处理代理类实例的方法调用并返回结果,当一个代理实例中的业务方法被调用时将自动调用该方法,proxy表示代理类的实例,method表示需要代理的方法,args表示代理方法的参数数组
Proxy
proxy中有四个静态方法//返回知道代理实例的调用处理程序
static InvocationHandler getInvocationHandler(Object proxy)
//返回代理类的Class对象,并向其提供类加载器和接口数组
static Class<?> getProxyClass(ClassLoader loader ,Class<?>[]interfaces)
//当且仅当指定的类通过getProxyClass 方法或 newProxyInstance 方法动态生产代理类时,返回true
static boolean isProxyClass(Class<?> cl)
//返回一个接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
//方法中ClassLoader loader 参数用来指定动态代理类的类加载器,Class<?>[]interfaces 用来指定代理类要实现的接口
//InvocationHandler h 用来指定与即将生成的动态代理对象相关联的调用程序
static Object newProxyInstance(ClassLoader loader,Class<?> interfaces ,InvocationHandler h)
相关代码在github中:https://github.com/zmj1314521/zmj.git