java-->spring动态代理分析
2023-01-05 09:35:13 0 举报
动态代理
作者其他创作
大纲/内容
公共接口public interface Subject { public String SayHello(String name);}
定义接口
实现类
public final class $Proxy0 extends Proxy implements Subject { private static Method m3; m3 = Class.forName(\"***.RealSubject\").getMethod(\"request\
最终会调用
newProxyInstance
public class Proxy implements java.io.Serializable {
作为参数
if (interfaces.length > 65535) { throw new IllegalArgumentException(\"interface limit exceeded\"); }
这个subKeyFactory,其实就是ProxyClassFactory工厂对象
public class LogitechMouse implements Mouse { @Override public void sell() { System.out.println(\"出售罗技鼠标\"); }
cons.newInstance(new Object[]{h});
目前只分析了jdk动态代理
public interface Mouse { public void sell() ;}
调用客户端 //代理的真实对象 Subject realSubject = new RealSubject(); InvocationHandler handler = new InvocationHandlerImpl(realSubject); ClassLoader loader = handler.getClass().getClassLoader(); // 获取类加载器 //获取真实对象的的接口的类 Class<?>[] interfaces = realSubject.getClass().getInterfaces(); Subject subject = (Subject) Proxy.font color=\"#ff3333\
复制代理类实现的所有接口final Class<?>[] intfs = interfaces.clone();
public class Proxy private static final Class<?>[] constructorParams = { InvocationHandler.class }; public static Object font color=\"#ff6666\
Proxy
Mouse logitechMouse = new LogitechMouse();
JDKProxy jdkProxy = new JDKProxy(logitechMouse);
jdk内置接口
动态代理代理类在程序运行时创建代理的方式叫动态代理,也就是说代理类并不是在java代码中定义的,而是在运行的时候动态生成的JDK动态代理JDK从1.3版本就开始支持动态代理类的创建。主要核心类只有2个:java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler
上面获取的只是Class对象,下面是获取指定的构造方法final Constructor<?> cons = cl.getConstructor(constructorParams);
生成的增强代理类
mouse.sell();
参数h是我们创建代理对象,这个执行完成可以在debug的时候看到生成的对象
public class RealSubject implements Subject { @Override public String SayHello(String name) { return \"hello \" + name; }
0 条评论
回复 删除
下一页