1、ProxyClassFactory
Proxy的内部类,功能为创建代理类
1.1、apply(ClassLoader loader, Class<?>[] interfaces)
创建代理类的实际过程
使用IdetityHashMap存储并检测接口的Class是否重复
检测传经来的接口的Class是否与Class.forName()通过指定的类加载器加载的一致。
检测Class.forName()加载后的Class是否为interface
1.1.1、确定proxyPkg:
如果有一个接口(apply方法中接收的interface)为非public接口,则获取该接口的完整包名作为proxyPkg的值,否则取ReflectUtil.PROXY_PACKAGE
1.1.2、生成代理类的名字proxyName
1.1.2.1、规则:
proxyPkg + proxyClassNamePrefix(值为$Proxy))+ num;
1.1.2.2、num来源:
创建了AtomicLong类型的属性nextUniqueNumber,使用其方法getAndIncrement()方法获取
1.1.3、生成代理类字节码文件
ProxyGenerator.generateProxyClass(String proxyName, Class<?>[] interfaces. Boolean accessFlags)
1.1.3.1、accessFlags
方法的属性,如public、static等
2、Proxy
Jdk动态代理时用到的类
2.1、两种方式创建代理类
2.1.1、一键式创建
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h);
通过该方法可以直接获取一个目标类型的代理类,然后可以直接调用目标方法。
2.1.2、分步骤创建(手动式)
①调用Proxy.getProxyClass(Classloader loader, Class<?>[] interfaces)获取代理类的Class对象
②传入参数类型InvocationHandler.class调用Class.getConstructor(InvocationHandler.class)方法获取代理类的构造方法。
③调用Constructor.newInstance(new MyInvocationHandler(new Hello()))传入自定义的InvocationHandler实例获取代理类的对象,其中Hello()为被代理类。