商户网站唯一订单号/网络销售工作靠谱吗

商户网站唯一订单号,网络销售工作靠谱吗,推广app渠道,软件下载网站知乎目 录 一、反射 Class 的 Method 1.反编译 String 类的方法签名 2.通过反射调用方法 3.反编译 String 类的构造方法签名 4.通过反射调用构造方法 二、类加载过程 1.装载(Loading) (1)说明 (2)双亲委…

目  录

一、反射 Class 的 Method

1.反编译 String 类的方法签名

2.通过反射调用方法

3.反编译 String 类的构造方法签名

4.通过反射调用构造方法

 二、类加载过程

1.装载(Loading)

(1)说明

(2)双亲委派机制

2.链接(Linking) 

(1)验证(Verify)

(2)准备(Prepare) 

(3)解析(Resolve)

3.初始化(initialization) 

三、类加载器获取 Class

1.说明

2.与 Class.forName() 比较

 四、反射的泛型

1.父类的泛型

2.接口的泛型 

3.属性的泛型

4.方法参数的泛型

5.方法返回值的泛型

6.构造方法参数的泛型


一、反射 Class 的 Method

1.反编译 String 类的方法签名

public class MethodTest {public static void main(String[] args) throws ClassNotFoundException {// 获取类信息Class<?> aClass = Class.forName("java.lang.String");// 获取类修饰符String classMod = Modifier.toString(aClass.getModifiers());// 获取简单类名String className = aClass.getSimpleName();// 获取简单父类名String classSupName = aClass.getSuperclass().getSimpleName();// 获取父类接口Class<?>[] classInterfaces = aClass.getInterfaces();// 获取所有方法Method[] declaredMethods = aClass.getDeclaredMethods();// 字符串拼接StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(classMod);stringBuilder.append(" class ");stringBuilder.append(className);stringBuilder.append(" extends ");stringBuilder.append(classSupName);if (classInterfaces.length > 0) {stringBuilder.append(" implements ");for (int i = 0; i < classInterfaces.length; i++) {stringBuilder.append(classInterfaces[i].getSimpleName());if (i != classInterfaces.length - 1) {stringBuilder.append(", ");}}}stringBuilder.append(" {\n");for (Method declaredMethod : declaredMethods) {stringBuilder.append("\t");// 获取方法修饰符String methodMod = Modifier.toString(declaredMethod.getModifiers());stringBuilder.append(methodMod);stringBuilder.append(" ");// 获取方法返回值类型Class<?> returnType = declaredMethod.getReturnType();stringBuilder.append(returnType.getSimpleName());stringBuilder.append(" ");// 获取方法名String methodName = declaredMethod.getName();stringBuilder.append(methodName);// 获取方法参数类型stringBuilder.append(" (");Parameter[] parameters = declaredMethod.getParameters();for (int i = 0; i < parameters.length; i++) {Parameter parameter = parameters[i];// 获取参数类型Class<?> parType = parameter.getType();stringBuilder.append(parType.getSimpleName());// 获取参数名String parName = parameter.getName();stringBuilder.append(" ");stringBuilder.append(parName);// 添加逗号分隔符,最后一个参数不加逗号if (i < parameters.length - 1) {stringBuilder.append(", ");}}stringBuilder.append(") {}\n");}stringBuilder.append("}");System.out.println(stringBuilder);}
}


2.通过反射调用方法

  1.  四要素:对象、方法、参数、值。缺一不可;
  2. 若方法不是 public 的,运行会报【java.lang.IllegalAccessException】异常,需要通过 setAccessible(true) 打破封装;
public class Person {public String name;private int age;protected String sex;public static String country;public static final String job = "程序员";public Person() {}public Person(String name, int age, String sex) {this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public static String getCountry() {return country;}public static void setCountry(String country) {Person.country = country;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}private void test(String s) {System.out.println("test(" + s + ")方法执行完毕!");}
}
public class UseMethod {public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {Person person = new Person();Class<? extends Person> aClass = person.getClass();// 获取方法Method test = aClass.getDeclaredMethod("test", String.class);// 设置方法可访问test.setAccessible(true);// 调用方法Object o = test.invoke(person, "参数列表");}
}


3.反编译 String 类的构造方法签名

public class MethodTest2 {public static void main(String[] args) throws ClassNotFoundException {// 获取类Class<?> aClass = Class.forName("java.lang.String");// 获取类修饰符String classMod = Modifier.toString(aClass.getModifiers());// 获取简单类名String className = aClass.getSimpleName();// 获取简单父类名String classSupName = aClass.getSuperclass().getSimpleName();// 获取父类接口Class<?>[] classInterfaces = aClass.getInterfaces();// 获取构造方法Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();// 拼接字符串StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(classMod);stringBuilder.append(" class ");stringBuilder.append(className);stringBuilder.append(" extends ");stringBuilder.append(classSupName);if (classInterfaces.length > 0) {stringBuilder.append(" implements ");for (int i = 0; i < classInterfaces.length; i++) {stringBuilder.append(classInterfaces[i].getSimpleName());if (i != classInterfaces.length - 1) {stringBuilder.append(", ");}}}stringBuilder.append(" {\n");for (Constructor<?> declaredConstructor : declaredConstructors) {// 获取构造方法修饰符String constructorMod = Modifier.toString(declaredConstructor.getModifiers());stringBuilder.append("\t");stringBuilder.append(constructorMod);// 获取构造方法名String constructorName = declaredConstructor.getName().replaceAll("java.lang.", "");stringBuilder.append(" ");stringBuilder.append(constructorName);// 获取构造方法参数Parameter[] parameters = declaredConstructor.getParameters();stringBuilder.append(" (");if (parameters.length > 0) {for (int i = 0; i < parameters.length; i++) {// 获取参数类型String paraType = parameters[i].getType().getSimpleName();stringBuilder.append(paraType);// 获取参数名String paraName = parameters[i].getName();stringBuilder.append(" ");stringBuilder.append(paraName);if (i != parameters.length - 1) {stringBuilder.append(", ");}}}stringBuilder.append(") {}\n");}stringBuilder.append("}");System.out.println(stringBuilder);}
}


4.通过反射调用构造方法

public class Person {public String name;private int age;protected String sex;public static String country;public static final String job = "程序员";public Person() {}public Person(String name, int age, String sex) {this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public static String getCountry() {return country;}public static void setCountry(String country) {Person.country = country;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}
}
public class UseConstructor {public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Person person = new Person();// 获取Class对象Class<? extends Person> aClass = person.getClass();// 获取无参构造方法Constructor<? extends Person> c1 = aClass.getDeclaredConstructor();System.out.println(c1);Person p1 = c1.newInstance();System.out.println(p1);// 获取有参构造方法Constructor<? extends Person> c2 = aClass.getDeclaredConstructor(String.class, int.class, String.class);System.out.println(c2);Person p2 = c2.newInstance("孔明", 18, "男");System.out.println(p2);}
}


 二、类加载过程

1.装载(Loading)

(1)说明

  1. 类加载器负责将类的 class 文件读入内存;
  2. 低版本 JDK 类加载器:
    1. 引导 / 启动 类加载器:负责加载 rt.jar,即核心类库;
    2. 扩展 类加载器:负责加载 ext/*.jar ;
    3. 系统 类加载器:负责加载 classpath 中的 class 文件。
  3. jdk 9 之后的 JDK 类加载器:
    1. BootstrapClassLoader(引导 / 启动 类加载器);
    2. PlatformClassLoader(平台类加载器);
    3. AppClassLoader(应用类加载器)。
  4. 高版本 JDK 中引入模块化;
  5. 可以自定义类加载器,只要符合规范即可;
  6. 可以通过 getParent() 方法获取 当前 类加载器 的 父 类加载器。
public class ClassLoaderTest {public static void main(String[] args) {// 获取应用类加载器ClassLoader cl1 = Person.class.getClassLoader();System.out.println(cl1);ClassLoader cl2 = ClassLoader.getSystemClassLoader();System.out.println(cl2);ClassLoader cl3 = Thread.currentThread().getContextClassLoader();System.out.println(cl3);// 获取平台类加载器ClassLoader cl1Parent = cl1.getParent();System.out.println(cl1Parent);ClassLoader cl2Parent = cl2.getParent();System.out.println(cl2Parent);ClassLoader cl3Parent = cl3.getParent();System.out.println(cl3Parent);// 获取启动类加载器,启动类加载器负责加载核心类库,名称读不到,直接输出 nullClassLoader cl1GrandParent = cl1Parent.getParent();System.out.println(cl1GrandParent);ClassLoader cl2GrandParent = cl2Parent.getParent();System.out.println(cl2GrandParent);ClassLoader cl3GrandParent = cl3Parent.getParent();System.out.println(cl3GrandParent);}
}


(2)双亲委派机制

  1. 某个类加载器接收到加载类的任务时,通常委托给【父 类加载器】完成加载;
  2. 顶级【父 类加载器】无法加载时,逐层向下委派加载任务;
  3. 这样做的原因是,可以保证程序的安全,也可以防止类加载重复。

2.链接(Linking) 

(1)验证(Verify)

        确保类加载信息符合 JVM 规范。


(2)准备(Prepare) 

  1. 正式为静态变量在方法区开辟存储空间并赋默认值;
  2. 举例如下:
    1. public static int i = 1;        // 实际上,赋默认值 0 
    2. public static final int i = 1;        // 此时赋值 1

(3)解析(Resolve)

        将虚拟机常量池中的符号引用替换为直接引用,即替换为地址。 


3.初始化(initialization) 

  1. 为静态变量赋值;
  2. 执行静态代码块。

三、类加载器获取 Class

1.说明

        上一节谈到,通过类加载器的方式可以获取 Class 。下面将做出详细解释:

public class ReflectLoader {public static void main(String[] args) throws ClassNotFoundException {// 获取 系统类 / 应用类 加载器,负责加载 classpath 中的 class 文件ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();System.out.println(systemClassLoader);// 加载 class,只是完成了类加载过程中的装载与链接,还没有初始化Class<?> aClass = systemClassLoader.loadClass("reflecttest.Person");System.out.println(aClass);// 在这个类第一次被真正使用的时候,才会初始化这个类}
}
public class Person {public String name;private int age;protected String sex;public static String country;public static final String job = "程序员";static {System.out.println("Person类静态代码块执行了");}public Person() {}public Person(String name, int age, String sex) {this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public static String getCountry() {return country;}public static void setCountry(String country) {Person.country = country;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}
}


2.与 Class.forName() 比较

        Class.forName() 会完成类加载的全部过程,如果使用类加载器的方式,可以看出没有执行静态代码块,也就是没有执行初始化的过程。而使用 Class.forName() 的方式,可以看到静态代码块执行了。

public class ReflectTest {public static void main(String[] args) throws ClassNotFoundException {Class<?> aClass = Class.forName("reflecttest.Person");System.out.println(aClass);}
}


 四、反射的泛型

1.父类的泛型

public class Animal<A, B, C> {
}
public class Dog extends Animal<String, Integer, Boolean> {
}
public class Test {public static void main(String[] args) {// 反射获取类Class<Dog> dogClass = Dog.class;// 获取当前类的父类泛型Type genericSuperclass = dogClass.getGenericSuperclass();// 如果父类使用了泛型if (genericSuperclass instanceof ParameterizedType){// 转换为参数化类型ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;// 获取泛型数组Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();// 遍历泛型数组for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument.getTypeName());}}}


2.接口的泛型 

public interface Animal<T, V, K> {
}
public class Cat implements Animal<String, Integer, Boolean> {
}
public class Test {public static void main(String[] args) {// 反射获取类Class<Cat> catClass = Cat.class;// 获取接口的泛型Type[] genericInterfaces = catClass.getGenericInterfaces();for (Type genericInterface : genericInterfaces) {if (genericInterface instanceof ParameterizedType) {ParameterizedType parameterizedType = (ParameterizedType) genericInterface;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}}
}


3.属性的泛型

public class Animal {public Map<Integer, Boolean> name;
}
public class Test {public static void main(String[] args) throws NoSuchFieldException {// 反射获取类Class<Animal> animalClass = Animal.class;// 获取属性Field field = animalClass.getField("name");// 获取属性泛型Type genericType = field.getGenericType();if (genericType instanceof ParameterizedType) {ParameterizedType parameterizedType = (ParameterizedType) genericType;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}
}


4.方法参数的泛型

public class Animal {public void eat(List<String> food) {}
}
public class Test {public static void main(String[] args) throws NoSuchMethodException {// 反射获取类Class<Animal> animalClass = Animal.class;// 获取方法Method declaredMethod = animalClass.getDeclaredMethod("eat", List.class);// 获取方法参数泛型Type[] genericParameterTypes = declaredMethod.getGenericParameterTypes();for (Type genericParameterType : genericParameterTypes) {if (genericParameterType instanceof ParameterizedType){ParameterizedType parameterizedType = (ParameterizedType) genericParameterType;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}}
}


5.方法返回值的泛型

public class Animal {public Map<String, Integer> eat(List<String> food) {return null;}
}
public class Test {public static void main(String[] args) throws NoSuchMethodException {// 反射获取类Class<Animal> animalClass = Animal.class;// 获取方法Method declaredMethod = animalClass.getDeclaredMethod("eat", List.class);// 获取方法返回值的泛型Type genericReturnType = declaredMethod.getGenericReturnType();if (genericReturnType instanceof ParameterizedType){ParameterizedType parameterizedType = (ParameterizedType) genericReturnType;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}
}


6.构造方法参数的泛型

public class Animal {private Map<String, Boolean> name;public Animal(Map<String, Boolean> name) {this.name = name;}
}
public class Test {public static void main(String[] args) throws NoSuchMethodException {// 反射获取类Class<Animal> animalClass = Animal.class;// 获取构造方法Constructor<Animal> animal = animalClass.getDeclaredConstructor(Map.class);// 获取构造方法参数泛型Type[] genericParameterTypes = animal.getGenericParameterTypes();for (Type genericParameterType : genericParameterTypes) {if (genericParameterType instanceof ParameterizedType) {ParameterizedType parameterizedType = (ParameterizedType) genericParameterType;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《数据结构:单链表》

“希望就像星星&#xff0c;或许光芒微弱&#xff0c;但永不熄灭。” 博主的个人gitee&#xff1a;https://gitee.com/friend-a188881041351 一.概念与结构 链表是一种物理存储上非连续、非顺序的存储结构&#xff0c;数据元素的顺序逻辑是通过链表中的指针链接次序实现的。 单…

蓝桥杯 - 中等 - 绝美宋词

介绍 “今宵酒醒何处&#xff0c;杨柳岸晓风残月”&#xff0c;“蓦然回首&#xff0c;那人却在灯火阑珊处”&#xff0c;“试问闲愁都几许&#xff1f;一川烟草&#xff0c;满城风絮&#xff0c;梅子黄时雨” ...... 宋词可谓是古代文学桂冠上一颗璀璨的明珠&#xff0c;本题…

JDBC、excute()、DriveManager、Connection、Statement、自建JDBC工具类、占位符

DAY19.2 Java核心基础 JDBC JDBC&#xff1a;Java database Connectivity JDBC是java程序连接各种数据库的组件 Mybatis就是基于JDBC的封装&#xff0c;是独立于数据库的管理系统&#xff0c;通用的SQL数据库存取和操作的公共接口 定义了一套标准&#xff0c;为访问 不同数…

21天Python计划:函数简单介绍

文章目录 前言一、函数知识体系二、函数基础函数的定义和调用函数参数 三、函数对象、函数嵌套、名称空间与作用域、装饰器函数对象函数嵌套名称空间与作用域装饰器 四、迭代器、生成器、面向过程编程迭代器生成器面向过程编程 五、三元表达式、列表推导式、生成器表达式、递归…

污水处理厂人员定位方案-UWB免布线高精度定位

1. 方案概述 本方案采用免布线UWB基站与北斗卫星定位融合技术&#xff0c;结合UWBGNSS双模定位工卡&#xff0c;实现污水处理厂室内外人员高精度定位&#xff08;亚米级&#xff09;。系统通过低功耗4G传输数据&#xff0c;支持实时位置监控、电子围栏、聚集预警、轨迹回放等功…

无人机DSP处理器工作要点!

一、DSP处理器在无人机中的工作要点 1. 高效运算架构 哈佛结构&#xff1a;DSP采用程序与数据存储分离的哈佛结构&#xff0c;允许同时访问指令和数据&#xff0c;提升数据吞吐效率。 流水线技术&#xff1a;将指令分解为取指、译码、执行等多个阶段并行处理&#xff0c…

MySQL查询成本计算

对于如上SQL&#xff0c;只是因为查询字段不同&#xff0c;最终执行时选择的索引就不同&#xff0c;那么MySQL是如何决定选择使用哪个索引呢&#xff1f; 答案是MySQL会进行成本计算&#xff0c;对于各个场景查询进行成本预估&#xff0c;最终选择最优。 我们可以使用trace工具…

《K230 从熟悉到...》矩形检测

《K230 从熟悉到...》矩形检测 《庐山派 K230 从熟悉到...》矩形检测 矩形检测技术是一种广泛应用于电子图像处理的核心技术。它通过识别和分析图像中的矩形结构&#xff0c;为各种应用提供基础支持。从传统图像处理算法到现代深度学习技术&#xff0c;矩形检测的实现途径多种多…

python基础学习三(元组及字符串的使用)

文章目录 元组什么是元组元组的创建方式为什么要将元组设计成不可变序列元组的遍历集合集合的相关操作集合操作集合的数学操作集合生成式列表&#xff0c;字典&#xff0c;元组&#xff0c;集合总结 字符串字符串的驻留机制判断字符串的操作方法字符串的比较操作字符串的切片操…

爬虫工程师分享自动批量化获取商品评论数据的方法有哪些?

在电商领域&#xff0c;商品评论数据对于商家了解产品口碑、洞悉用户需求&#xff0c;以及开展竞品分析等工作具有极其重要的价值。作为爬虫工程师&#xff0c;掌握自动批量化获取商品评论数据的方法&#xff0c;能极大提升数据收集效率。下面&#xff0c;我将分享一些实用的操…

Vue3组件事件用户信息卡练习

用户信息卡 题目要求 实现一个用户信息卡系统&#xff0c;包含以下功能&#xff1a; 1.父组件收集用户信息&#xff08;姓名、年龄、班级&#xff09; 2.子组件接收并展示用户信息卡片 3.添加基本的数据验证 <!DOCTYPE html> <html lang"en"> <h…

SpringBean模块(二)bean初始化(2)和容器初始化顺序的比较--引入ApplicationContextInitializer

前面介绍了获取容器可以让spring bean实现ApplicationContextAware&#xff0c;实际也是初始化执行了setApplicationContext接口&#xff0c; 初始化接口还可以借助一些注解或者spring bean的初始化方法&#xff0c;那么他们的执行顺序是什么样的呢&#xff1f; 一、验证&…

中小型企业网络的搭建

1.1 网络逻辑拓扑、布线方案的设计 1.1.1 网络设计依据 网络设计应遵循以下基本原则&#xff1a; 高效性&#xff1a;确保网络架构能够支持企业日常业务的高效运行。 可靠性&#xff1a;采用冗余设计&#xff0c;确保网络的高可用性&#xff0c;避免单点故障。 可扩展性…

angr基础学习

参考&#xff1a;angr AngrCTF_FITM/笔记/03/Angr_CTF从入门到精通&#xff08;三&#xff09;.md at master ZERO-A-ONE/AngrCTF_FITM angr_explore 00_angr_find IDA分析结果&#xff1a; 逻辑简单&#xff0c;输入&#xff0c;complex_function进行加密&#xff0c;加密…

软考-高级-系统架构设计师【考试备考资料下载】

计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试是原中国计算机软件专业技术资格和水平考试的完善与发展。计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试是由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试。 计算机技术与软件专…

3. 第三放平台部署deepseek

有时候我们会发现使用deepseek服务器&#xff0c;异常卡顿&#xff0c;这是由于多方面原因造成的&#xff0c;比如说访问人数过多等。想要解决这个问题&#xff0c;我们可以选择第三方平台进行部署 第三方平台 我们可以选择的第三方平台很多&#xff0c;比如硅基流动、秘塔搜索…

1.4-蜜罐\堡垒机\API接口

1.4-蜜罐\堡垒机\API接口 蜜罐&#xff1a;用来钓鱼或诱惑测试人员的防护系统 bash <(curl -sS -L https://hfish.net/webinstall.sh) # 安装HFISH蜜罐堡垒机&#xff1a; 运维用的&#xff0c;统一管理运维平台;拿下堡垒机就很有可能等于拿下了多个平台 jumpServer一键安…

知识图引导的检索增强生成

摘要 检索增强生成&#xff08;RAG&#xff09;已经成为一种很有前途的技术&#xff0c;用于解决大型语言模型&#xff08;LLM&#xff09;生成的响应中的幻觉问题。现有的RAG研究主要集中在应用基于语义的方法来提取孤立的相关组块&#xff0c;忽略了它们之间的内在关系。在本…

【机器学习】imagenet2012 数据预处理数据预处理

【机器学习】数据预处理 1. 下载/解压数据2. 数据预处理3. 加载以及训练代码3.1 使用PIL等加载代码3.2 使用OpenCV的方式来一张张加载代码3.3 h5的方式来加载大文件 最后总结 这个数据大约 140个G,128w的训练集 1. 下载/解压数据 首先需要下载数据&#xff1a; 数据最后处理…

质量工程:数字化转型时代的质量体系重构

前言&#xff1a;质量理念的范式转移阅读原文 如果把软件开发比作建造摩天大楼&#xff1a; 传统测试 竣工后检查裂缝&#xff08;高成本返工&#xff09; 质量工程 从地基开始的全流程监理体系&#xff08;设计图纸→施工工艺→建材选择→竣工验收&#xff09; IEEE研究…