您现在的位置是:主页 > news > 哈尔滨网站制作公司哪家好/哪个平台可以随便发广告
哈尔滨网站制作公司哪家好/哪个平台可以随便发广告
admin2025/6/25 22:16:48【news】
简介哈尔滨网站制作公司哪家好,哪个平台可以随便发广告,自已做的网站怎么做域名解析,手机网站app文章目录动态代理一、动态代理的特点二、动态代理实现步骤三、动态代理的方式四、动态代理测试(1)厂家接口类SaleComputer(2)联想代理商Lenove(3)代理测试proxyTest增强对象功能的两种设计模式是装饰者模式(装饰者模式是静态代理的一种体现)和代理模式。其中代理模式的实现方式…
哈尔滨网站制作公司哪家好,哪个平台可以随便发广告,自已做的网站怎么做域名解析,手机网站app文章目录动态代理一、动态代理的特点二、动态代理实现步骤三、动态代理的方式四、动态代理测试(1)厂家接口类SaleComputer(2)联想代理商Lenove(3)代理测试proxyTest增强对象功能的两种设计模式是装饰者模式(装饰者模式是静态代理的一种体现)和代理模式。其中代理模式的实现方式…
文章目录
- 动态代理
- 一、动态代理的特点
- 二、动态代理实现步骤
- 三、动态代理的方式
- 四、动态代理测试
- (1)厂家接口类SaleComputer
- (2)联想代理商Lenove
- (3)代理测试proxyTest
增强对象功能的两种设计模式是装饰者模式
(装饰者模式是静态代理的一种体现)和代理模式
。其中代理模式的实现方式有静态代理
(有一个类文件描述代理模式)和动态代理
(在内存中形成代理类),本文章主要讲解代理模式的动态代理
。
动态代理
一、动态代理的特点
- 字节码随用随创建,随用随加载。
与静态代理的区别也在于此。因为静态代理是字节码一上来就创建好,并完成加载。 - 装饰者模式就是静态代理的一种体现。
代理模式:代理对象代理真实对象,达到增强真实对象功能的目的。
二、动态代理实现步骤
- ①代理对象和真实对象实现相同的接口。
- ②代理对象 = Proxy.newInstance();
- ③使用代理对象调用方法。
- ④增强方法。
三、动态代理的方式
- 基于接口JDK代理
提供者:JDK 官方的 Proxy 类。
要求:被代理类最少实现一个接口。 - 基于子类CGLIB代理
提供者:第三方的 CGLib,如果报 asmxxxx 异常,需要导入 asm.jar。
要求:被代理类不能用 final 修饰的类(最终类)。
四、动态代理测试
演示通过
代理商
向厂家购买电脑。
(1)厂家接口类SaleComputer
package com.gql.proxy;
/*** 类说明:* 厂家接口* @guoqianliang1998.*/
public interface SaleComputer {public String sale(double money);public void show();
}
(2)联想代理商Lenove
package com.gql.proxy;
/*** 类说明:* 真实类* @guoqianliang1998.*/
public class Lenove implements SaleComputer{@Overridepublic String sale(double money) {System.out.println("花了"+money+"元买了一台联想电脑");return "联想电脑";}@Overridepublic void show() {System.out.println("展示电脑..."); }
}
(3)代理测试proxyTest
动态代理增强方式有三种:
- 增强参数列表
- 增强返回值类型
- 增强方法体执行逻辑
package com.gql.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 类说明:* 代理测试类* @guoqianliang1998.*/
public class proxyTest {public static void main(String[] args) {//1.创建真实对象final Lenove lenovo = new Lenove();//2.动态代理增强lenovo对象/*** 三个参数:* 1.类加载器:真实对象.getClass().getClassLoader()* 2.接口数组:真实对象.getClass().getInterfaces()* 3.处理器:new InvocationHandler()*/SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(),lenovo.getClass().getInterfaces() , new InvocationHandler() {@Override /*** invoke方法:* 代理逻辑编写方法,代理对象调用的所有方法都会触发invoke* 三个参数:* 1.proxy:代理对象* 2.method:代理对象调用的方法,被封装为的对象* 3.args:代理对象调用方法时,传递的实际参数*/public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//①增强参数//判断是否是sale方法if("sale".equals(method.getName())){double money = (Double) args[0];money =money*0.8;Object obj = method.invoke(lenovo, money);//③增强方法体System.out.println("送货到家...");//②增强返回值return obj+",鼠标";}else{Object obj = method.invoke(lenovo, args);return obj;}}});//3.调用方法String computer = proxy_lenovo.sale(8000);System.out.println(computer);}
}