您现在的位置是:主页 > news > 哈尔滨网站制作公司哪家好/哪个平台可以随便发广告

哈尔滨网站制作公司哪家好/哪个平台可以随便发广告

admin2025/6/25 22:16:48news

简介哈尔滨网站制作公司哪家好,哪个平台可以随便发广告,自已做的网站怎么做域名解析,手机网站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);}
}