2026/4/6 2:27:57
网站建设
项目流程
买完域名后怎么做网站,西宁网站建设推广,oa系统公司排名,做斗图的网站首先通俗的介绍什么是代理#xff0c;我以自身的一个例子来说吧#xff0c;主播特别喜欢一款游戏#xff0c;那个游戏做任务会给很多奖励#xff0c;但是呢我平常没有那么多时间来做任务#xff0c;又想要得做完任务给的奖励#xff0c;所以我找了一个游戏带打#xff0…首先通俗的介绍什么是代理我以自身的一个例子来说吧主播特别喜欢一款游戏那个游戏做任务会给很多奖励但是呢我平常没有那么多时间来做任务又想要得做完任务给的奖励所以我找了一个游戏带打可以帮我刷任务我可以直接想用奖励就行了美滋滋啦。下面让我来从代理模式来分析一下吧上面中的我就是被代理的对象叫做目标类而我找的代打叫做代理对象。动态代理-JDK动态代理要求目标对象必须要实现至少一个接口java动态代理会创建实现了相同接口的代理类然后在运行时动态生成该代理类的实例。那么JDK动态代理为什么要实现至少一个接口因为JDK动态代理的核心类是java.lang.reflect.Prox这个类的实现方式如下其次JDK在动态代理的时候会生成一个新的类这个类继承于java.lang.reflect.Prox由于java是单继承代理类已经实现了继承proxy所以只能通过实现接口的方式来代理方法下面我来讲讲JDK动态代理实现流程DK动态代理通过Proxy类创建代理对象所有对代理对象的方法调用都会被转发到实现了InvocationHandler接口的处理器handler的invoke()方法中从而实现方法调用的拦截和增强。下面让我来分步讲解首先创建业务类的接口和实现类这俩就不细讲了直接上车现在我们已经有了目标类也就是上图的OrderService类然后来创建代理类代理类呢是通过拦截目标类的方法调用通过代理类来调用目标类的方法所以呢先通过静态工厂方法创建代理类也就是先找一个帮我刷任务的人下面让我来解释一下创建代理对象要传的三个参数ClassLoader loader动态加载代理类到JVM确保代理类和目标类在同一个类加载器作用域中有以下几种方式// 通常使用目标对象的类加载器 ClassLoader loader target.getClass().getClassLoader(); // 也可以使用线程上下文类加载器 ClassLoader loader Thread.currentThread().getContextClassLoader(); // 或使用接口的类加载器 ClassLoader loader UserService.class.getClassLoader();Class?[] interfaces定义代理类要实现哪些接口// 获取目标对象实现的所有接口 Class?[] interfaces target.getClass().getInterfaces(); // 例如返回[UserService.class, Serializable.class] // 也可以手动指定接口 Class?[] interfaces new Class[]{UserService.class};如果返回了空数组就会创建失败这也是为什么目标对象至少要实现一个接口InvocationHandler 处理器拦截所有代理对象的方法调用并且通过重写拦截器中invoke()方法来实现对目标类功能的一些加强比如添加日志之类的MyInvocationHandler处理器类实现了InvocationHandler接口private Object target; 存储真实业务对象的引用(如OrderServiceImpl)通过构造器注入依赖这儿有一个问题依赖注入为什么要用构造器注入set注入不行吗1.多线程环境下有可能没有进行setTarget(),别的线程就进行调用此时target为null例如2.InvocationHandler要求创建后立即可用构造器注入在实例化时完成了属性注入而setter注入是先进行实例化再进行实例化target可能不完整3. 使用构造器注入 final不可变线程安全而setter注入对注入字段不能加final关键字下面讲一下重写invoke函数的参数意义proxy-代理对象引用动态生成的代理类实例用于方法转发method-方法元数据包含被调用方法的所有信息用于反射调用args-实际参数值调用时传入的具体参数值数组method.invoke()是通过反射机制调用目标对象类target是目标对象类args是调用方法时传入的参数。下面就是测试类了JDK动态代理主要流程如下客户端 → 代理对象 → InvocationHandler.invoke() → 反射调用真实对象方法总结下来就是一句话JDK动态代理Proxy创建 InvocationHandler拦截 接口约束实现运行时的无侵入式方法增强。