JDK动态代理的示例图,下图的绿色箭头表示实现的关系,白色虚线表示依赖关系,target表示被ProxyFactory的target成员表示代理类对象,由ProxyFactory传入的Object参数初始化,接着调用getProxyInstance函数利用反射来返回代理对象
静态代理文章------>静态代理文章,图+代码解释代理–>对象和被代理对象基本概念
与静态代理不一样,静态代理是通过聚合被代理对象,当我调用代理对象方法func的时候,我通过代理对象func方法底层里面偷摸着调用被代理对象的方法!静态代理里面代理对象和被代理对象都实现了一个IxxxDao接口。而动态代理的做法是采取反射,代理对象没有实现接口,只有被代理对象实现了接口,这种方式也叫做jdk代理。
package com.hmdp.service.尚硅谷的代理模式2;
import java.lang.reflect.Proxy;
interface ITeacherDao {
void teach();
}
class TeacherDao implements ITeacherDao {
@Override
public void teach(){
System.out.println("老师授课中...");
}
}
class ProxyFactory {
// 维护一个目标对象
private Object target;
// 构造器,对target进行初始化
public ProxyFactory(Object target)
{
this.target = target;
}
// 给目标对象生成一个代理对象
public Object getProxyInstance()
{
/***
* 1. ClassLoader loader:指定当前目标对象使用的类加载器,获取加载器的方法固定
* 2. Class<?>[] interfaces:指定目标对象实现的接口的类型,使用泛型方法确认类型
* 3. InvocationHandler h:事情处理,执行目标对象的方法时,会触发事情处理器方法,
* 会把当前执行目标对象的方法作为参数传入
*/
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
(proxy, method, args) -> {
System.out.println("JDK代理开始");
// 执行目标对象方法
Object returnVal = method.invoke(target, args);
System.out.println("JDK代理提交");
return returnVal;
});
}
}
public class Main {
public static void main(String[] args) {
ITeacherDao target = new TeacherDao();
ProxyFactory proxyFactory = new ProxyFactory(target);
ITeacherDao proxyInstance = (ITeacherDao) proxyFactory.getProxyInstance();
// 输出proxyInstance=class com.hmdp.service.尚硅谷的代理模式2.$Proxy0内存中生成了代理对象
// System.out.println("proxyInstance=" + proxyInstance.getClass());
//System.out.println("proxyInstance=" + proxyInstance);
proxyInstance.teach();
}
}
如何认识到动态代理是基于反射来做的呢?
我们可以深入源码分析!
如果我们学习过反射的基本API,我们就知道下图中就是基于反射来做的了