Java基础 - 14 - Java高级技术
一.单元测试
就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试
1.1 Junit单元测试框架
可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经集成了Junit框架,如IDEA)
优点
可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立
不需要程序员去分析测试的结果,会自动生成测试报告出来

//StringUtil
public class StringUtil {public static void printNumber(String name){if(name == null){System.out.println("名字长度:" + 0);return;}System.out.println("名字长度:" + name.length());}//求字符串的最大索引public static int getMaxIndex(String data){if(data == null){return -1;}return data.length()-1;}
}//StringUtilTest
//测试类
public class StringUtilTest {@Test //测试方法的必须拥有@Test注解public void testPrintNumber(){StringUtil.printNumber("admin");StringUtil.printNumber(null);}@Test //测试方法的必须拥有@Test注解public void testGetMaxIndex(){int index1 = StringUtil.getMaxIndex(null);System.out.println(index1);int index2 = StringUtil.getMaxIndex("admin");System.out.println(index2);//断言机制:程序员可以通过预测业务方法的结果Assert.assertEquals("方法内有bug",4,index2);}
}
1.2 Junit框架的常用注解

在测试方法执行前执行的方法,常用于:初始化资源
在测试方法执行完后再执行的方法,常用于:释放资源
//测试类
public class StringUtilTest {@Beforepublic void test1(){System.out.println("----> test1 Before 执行了 -----------");}@Afterpublic void test2(){System.out.println("----> test2 After 执行了 -----------");}@BeforeClasspublic static void test3(){System.out.println("----> test3 BeforeClass 执行了 -----------");}@AfterClasspublic static void test4(){System.out.println("----> test4 AfterClass 执行了 -----------");}@Test //测试方法的必须拥有@Test注解public void testPrintNumber(){StringUtil.printNumber("admin");StringUtil.printNumber(null);}@Test //测试方法的必须拥有@Test注解public void testGetMaxIndex(){int index1 = StringUtil.getMaxIndex(null);System.out.println(index1);int index2 = StringUtil.getMaxIndex("admin");System.out.println(index2);//断言机制:程序员可以通过预测业务方法的结果Assert.assertEquals("方法内有bug",4,index2);}
}

二.反射
反射(Reflection)就是加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)
反射学什么?
学习获取类的信息、操作它们
1.反射第一步:加载类,获取类的字节码:Class对象
2.获取类的构造器:Constructor对象
3.获取类的成员变量:Field对象
4.获取类的成员方法:Method对象
2.1 反射第一步:加载类,获取类的字节码:Class对象
获取Class对象的三种方式
· Class c1 = 类名.class
· 调用class提供方法:public static Class forName(String package);
· Object提供的方法:public Class getClass(); Class c3 = 对象.getClass();
//demo
public class demo {public static void main(String[] args) throws Exception {Class c1 = Student.class;System.out.println(c1.getName()); //全类名System.out.println(c1.getSimpleName()); //简名Class c2 = Class.forName("com.wosun.jinjie.Student");System.out.println(c1 == c2);Student student = new Student();Class c3 = student.getClass();System.out.println(c3 == c1);}
}//Student
public class Student {
}
2.2 获取类的构造器:Constructor对象
获取类构造器的作用:依然是初始化对象返回
//TestConstructor
public class TestConstructor {//拿全部的构造器@Testpublic void testGetConstructors() {//1.反射第一步:必须先得到这个类的Class对象Class c = Cat.class;//2.获取类的全部构造器//Constructor[] constructors = c.getConstructors(); //只能获取public修饰的构造器Constructor[] constructors = c.getDeclaredConstructors(); //只要存在的构造器都能拿到//遍历数组中的每个构造器对象for (Constructor constructor : constructors) {System.out.println(constructor.getName() + "---->" + constructor.getParameterCount());}}//拿某个构造器@Testpublic void testGetConstructor() throws Exception {//1.反射第一步:必须先得到这个类的Class对象Class c = Cat.class;//2.获取类的某个构造器:无参数构造器//Constructor constructor1 = c.getConstructor(); //只能获取public修饰的构造器Constructor constructor1 = c.getDeclaredConstructor(); //只要存在的构造器都能拿到System.out.println(constructor1.getName() + "---->" + constructor1.getParameterCount());constructor1.setAccessible(true); //禁止检查访问权限Cat cat1 = (Cat) constructor1.newInstance();System.out.println(cat1);//3.获取类的某个构造器:有参数构造器//Constructor constructor2 = c.getConstructor(String.class , int.class); //只能获取public修饰的构造器Constructor constructor2 = c.getDeclaredConstructor(String.class , int.class);System.out.println(constructor2.getName() + "---->" + constructor2.getParameterCount());constructor1.setAccessible(true); //禁止检查访问权限Cat cat2 = (Cat) constructor2.newInstance("叮当猫", 3);System.out.println(cat2);}
}//Cat
public class Cat {private String name;private int age;public Cat() {System.out.println("无参数构造器执行了");}public Cat(String name, int age) {this.name = name;this.age = age;}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;}@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +'}';}
}
2.3 获取类的成员变量:Field对象
获取到成员变量的作用:依然是赋值、取值

//TestField
public class TestField {@Testpublic void TestGetFields() throws Exception {//1.反射第一步:必须先得到类的class对象Class c = Cat.class;//2.获取类的全部成员变量Field[] fields = c.getDeclaredFields();//3.遍历成员变量数组for (Field field : fields) {System.out.println(field.getName() + "---->" + field.getType());}//4.定位某个成员变量Field fName = c.getDeclaredField("name");System.out.println(fName.getName() + "===>" + fName.getType());Field fAge = c.getDeclaredField("age");System.out.println(fAge.getName() + "===>" + fAge.getType());//赋值Cat cat = new Cat();fName.setAccessible(true);fName.set(cat, "咖啡猫");System.out.println(cat);//取值String name = (String) fName.get(cat);System.out.println(name);}
}//Cat
public class Cat {private static int a;public static final String COUNTRY = "CHN";private String name;private int age;public Cat() {System.out.println("无参数构造器执行了");}public Cat(String name, int age) {System.out.println("有参数构造器执行了");this.name = name;this.age = age;}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;}@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +'}';}
}
2.4 获取类的成员方法:Method对象
成员方法的作用:依然是执行
//TestMethod
public class TestMethod {@Testpublic void TestGetMethods() throws Exception {//1.反射第一步:先得到Class对象Class c = Cat.class;//2.获取类的全部成员方法Method[] methods = c.getDeclaredMethods();//3.遍历数组中的每个方法对象for (Method method : methods) {System.out.println(method.getName() + "===>" + method.getParameterCount() + "===>" + method.getReturnType());}Method method_run = c.getDeclaredMethod("run");System.out.println(method_run.getName() + "===>" + method_run.getParameterCount() + "===>" + method_run.getReturnType());Method method_eat =c.getDeclaredMethod("eat", String.class);System.out.println(method_eat.getName() + "===>" + method_eat.getParameterCount() + "===>" + method_eat.getReturnType());Cat cat = new Cat();method_run.setAccessible(true);Object rs1 = method_run.invoke(cat);//调用无参的run方法,用cat对象触发调用的System.out.println(rs1);Object rs2 = method_eat.invoke(cat,"🐟");System.out.println(rs2);}
}//Cat
public class Cat {private static int a;public static final String COUNTRY = "CHN";private String name;private int age;public Cat() {System.out.println("无参数构造器执行了");}public Cat(String name, int age) {System.out.println("有参数构造器执行了");this.name = name;this.age = age;}private void run(){System.out.println("跑的真快");}public void eat(){System.out.println("爱吃猫粮");}public String eat(String name){return "猫最爱吃" + name;}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;}@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +'}';}
}
2.5 反射的作用、应用场景
反射的作用
· 基本作用:可以得到一个类的全部成分然后操作
· 可以破坏封装性
· 最重要的用途是:适合做Java的框架,基本上主流的框架都会基于反射设计出一些通用的功能


//TestFrame
public class TestFrame {@Testpublic void save() throws Exception {Student s1 = new Student("张三",22,'男',180.5,"编程");Teacher t1 = new Teacher("李四",1000000);//需求:把任意对象的字段名和其对应的值等信息,保存到文件中ObjectFrame.saveObject(s1);ObjectFrame.saveObject(t1);}
}//ObjectFrame
public class ObjectFrame {//目的:保存任意对象的字段和其数据到文件中去public static void saveObject(Object obj) throws Exception {//创建打印流PrintStream ps = new PrintStream(new FileOutputStream("src\\data.txt",true));//obj是任意对象,到底有多少个字段要保存呢?Class c = obj.getClass();String cName = c.getSimpleName();ps.println("---------" + cName + "---------");//从这个类中提取它的全部成员变量Field[] fields = c.getDeclaredFields();//遍历每个成员变量for (Field field : fields) {//拿到成员变量的名字String name = field.getName();//拿到这个成员变量在对象中的数据field.setAccessible(true); //禁止检查访问控制String value = field.get(obj) + "";ps.println(name + "=" + value);}ps.close();}
}//Student
public class Student {private String name;private int age;private char sex;private double height;private String hobby;public Student() {}public Student(String name, int age, char sex, double height, String hobby) {this.name = name;this.age = age;this.sex = sex;this.height = height;this.hobby = hobby;}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 char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}
}//Teacher
public class Teacher {private String name;private double salary;public Teacher() {}public Teacher(String name, double salary) {this.name = name;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}
}
三.注解
注解(Annotation)就是Java代码里的特殊标记,比如:@Override、@Test等,作用是让其他程序根据注解信息来决定怎么执行该程序
· 注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处
自定义注解
public @interface 注解名称 {
public 属性类型 属性名() default 默认值;
}
特殊属性名:value
· 如果注解中只有一个value属性,使用注解后,value名称可以不写!!
//AnnotationTest @MyTest1(aaa = "牛魔王", ccc = {"java","python"})
// @MyTest2(value = "孙悟空")
// @MyTest2("孙悟空") //如果只有一个属性,可以不写value
// @MyTest2(value = "孙悟空", age = 100)
@MyTest2("孙悟空") //如果除了value其他属性都有默认值,也可以不写value
public class AnnotationTest {@MyTest1(aaa = "铁扇公主", bbb = false, ccc = {"c","c++"})public void test1(){}
}/*** 自定义注解*/
public @interface MyTest1 {String aaa();boolean bbb() default true;String[] ccc();
}public @interface MyTest2 {String value(); //特殊属性int age() default 22;
}

· 注解本质是一个接口,Java中所有注解都继承了Annotation接口的
· @注解(…):其实就是一个实现类对象,实现了该注解以及Annotation接口
3.1 元注解
指的是:修饰注解的注解

//MyTest3@Target({ElementType.TYPE, ElementType.METHOD}) //ElementType.TYPE当前被修饰的注解只能用在类上
@Retention(RetentionPolicy.RUNTIME) //控制下面的注解一直保留到运行时
public @interface MyTest3 {
}
3.2 注解的解析
就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来
如何解析注解?
· 指导思想:要解析谁上面的注解,就应该先拿到谁
· 比如要解析类上面的注解,则应该先获取该类的Class对象,再通过Class对象解析其上面的注解
· 比如要解析成员方法上的注解,则应该获取到该成员方法的method对象,再通过Method对象解析其上面的注解
· Class、Method、Field、Constructor都实现了AnnotatedElement接口,它们都拥有解析注释的能力


//MyTest4@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest4 {String value();double aaa() default 100;String[] bbb();
}//demo@MyTest4(value = "张三", aaa = 99, bbb={"java","python"})
public class demo {@MyTest4(value = "李四", bbb={"c","c++"})public void test1(){}
}//AnnotationTest2 public class AnnotationTest2 {@Testpublic void parseClass(){//1.先得到Class对象Class c = demo.class;//2.解析类上的注解//判断类上是否包含了某个注解if(c.isAnnotationPresent(MyTest4.class)){MyTest4 myTest4 = (MyTest4) c.getDeclaredAnnotation(MyTest4.class);System.out.println(myTest4.value());System.out.println(myTest4.aaa());System.out.println(Arrays.toString(myTest4.bbb()));}}@Testpublic void parseMethod() throws Exception {//1.先得到Class对象Class c = demo.class;Method m = c.getDeclaredMethod("test1");//2.解析类上的注解//判断方法上是否包含了某个注解if(m.isAnnotationPresent(MyTest4.class)){MyTest4 myTest4 = (MyTest4) m.getDeclaredAnnotation(MyTest4.class);System.out.println(myTest4.value());System.out.println(myTest4.aaa());System.out.println(Arrays.toString(myTest4.bbb()));}}
}
3.3 注解的应用场景

//MyTest@Target(ElementType.METHOD) //只能注解方法
@Retention(RetentionPolicy.RUNTIME) //让当前注解可以一直存活
public @interface MyTest {}//AnnotationTest
public class AnnotationTest {// @MyTestpublic void test1(){System.out.println("=====test1=====");}@MyTestpublic void test2(){System.out.println("=====test2=====");}// @MyTestpublic void test3(){System.out.println("=====test3=====");}@MyTestpublic void test4(){System.out.println("=====test4=====");}public static void main(String[] args) throws Exception {AnnotationTest t = new AnnotationTest();//启动程序//1.得到class对象Class c = AnnotationTest.class;//2.提取类中的全部成员方法Method[] methods = c.getDeclaredMethods();//3.遍历这个数组中的每个方法,看这个方法是否存在@Mytest注解for (Method method : methods) {if(method.isAnnotationPresent(MyTest.class)){//说明当前方法上是存在@MyTestmethod.invoke(t);}}}
}
四.动态代理
程序为什么需要代理?
对象如果嫌身上干的事情太多,可以通过代理来转移部分职责
代理长什么样?
对象有什么方法想被代理,代理就一定要有对应的方法
中介如何知道要派有什么样方法的代理呢?
接口!

//Test
public class Test {public static void main(String[] args) {BigStar bigStar = new BigStar("张三");Star starProxy = ProxyUtil.createProxy(bigStar);String rs = starProxy.sing("好日子");System.out.println(rs);starProxy.dance();}
}//ProxyUtil
public class ProxyUtil {public static Star createProxy(BigStar bigStar){/*** public static Object newProxyInstance(ClassLoader loader,* Class<?>[] interfaces,* InvocationHandler h)* 参数1:用于指定一个类加载器* 参数2:指定生成的代理长什么样子,也就是有哪些方法* 参数3:用来指定生成的代理对象想干什么事情*/Star startProxy = (Star)Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{Star.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//代理对象要做的事情if(method.getName().equals("sing")){System.out.println("收钱20w");//return method.invoke(bigStar,args);}else if(method.getName().equals("dance")){System.out.println("收钱30w");//return method.invoke(bigStar,args);}return method.invoke(bigStar,args);}});return startProxy;}
}//Star
public interface Star {String sing(String name);void dance();
}//BIgStar
public class BigStar implements Star{private String name;public BigStar(String name) {this.name = name;}public String sing(String name){System.out.println(this.name + "正在唱" +name);return "thanks";}public void dance(){System.out.println(this.name + "正在跳舞");}
}相关文章:
Java基础 - 14 - Java高级技术
一.单元测试 就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试 1.1 Junit单元测试框架 可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经集成了Junit框架,如IDEAÿ…...
glsl着色器学习(六)
准备工作已经做完,下面开始渲染 gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);gl.clearColor(0.5, 0.7, 1.0, 1.0); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);gl.enable(gl.DEPTH_TEST); gl.enable(gl.CULL_FACE);设置视口 gl.viewport(0,…...
毒枸杞事件启示录:EasyCVR视频AI智能监管方案如何重塑食品卫生安全防线
一、方案背景 近年来,食品安全问题频发,引发了社会各界的广泛关注。其中,毒枸杞事件尤为引人关注。新闻报道,在青海格尔木、甘肃靖远等地,部分商户为了提升枸杞的品相,违规使用焦亚硫酸钠和工业硫磺进行“…...
git进阶·团队开发的时候为何要创建临时分支来修复bug
若在团队开发中,突然遇到一个功能性bug,你会怎么使用git来管理分支呢? 在近些年来,团队工作的经验中,我总结出来的是,最好是先创建一个临时分支来修复bug,修复好后,再合并到主分支或…...
Unity 性能优化工具收集
本文地址:https://blog.csdn.net/t163361/article/details/141809415 Unity原始工具 UPR 官方 UPR UPR桌面端解决方案,减轻测试设备性能压力,使测试过程更加顺畅。提供CLI用于自动化测试系统对接。 PerformanceBenchmarkReporter Unity 性…...
linux下的Socket网络编程教程
套接字概念 Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。与管道类似的,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作…...
华为人工智能重要服务总结
一,视觉智能服务 一,图像识别服务 1.媒资图像标签服务 媒资素材管理,内容推荐广告营销等 2.图像描述服务 融合计算机视觉,自然语言处理和多模态技术,对输入图像进行画面内容描述 3.主体识别服务 像主体识别能检测出…...
涉嫌欺诈者利用机器人通过播放AI创作的音乐赚取1000万美元版税
北卡罗莱纳州的一名男子因涉嫌上传数十万首由AI生成的歌曲到流媒体服务平台,并使用机器人播放数十亿次而面临诈骗指控。自2017年以来,Michael Smith据称通过这一方式获得了超过1000万美元的版税收入。更多详情 现年52岁的Smith于周三被逮捕。同一天公布…...
k8s helm
k8s Helm 是Kubernetes的包管理工具,类似于Linux系统中常用的apt、yum等包管理工具。Helm通过定义、安装和升级Kubernetes应用程序来简化Kubernetes应用部署的复杂性。以下是对k8s Helm的详细解析: 一、Helm的基本概念 Chart:Chart是Helm的…...
KMP 详解
KMP数组存的是什么 对于一个字符串 b,下标从1开始。 则kmp[i]表示 以i结尾的连续子串 s的前缀的最大值(等价于前缀最大结尾处) 如何求KMP 假设 i 以前的KMP都被求出来了。 j 表示上一个字符可以成功匹配的长度(等价于下标) …...
go语言并发编程-超详细mutex解析
文章目录 1 go语言并发编程学习-mutex1.1 学习过程1.2 如何解决资源并发访问的问题?【基本用法】1.2.1 并发访问带来的问题1.2.1.1 导致问题的原因 1.2.2 race detector检查data race1.2.3 mutex的基本实现机制以及使用方法1.2.3.1 具体使用-11.2.3.1 具体使用-2 1 …...
VirtualBox Debian 自动安装脚本
概览 相较于原脚本(安装目录/UnattendedTemplates/debian_pressed.cfg)更新如下内容: 配置清华镜像源配置仅主机网卡(后续只需添加仅主机网卡即可)配置Root用户远程登录配置用户sudo组 脚本 debian_pressed.cfg ##…...
最好的开放式耳机?五款红榜开放式耳机推荐!
面对众多的开放式耳机选项,消费者可能会感到难以抉择。买耳机不一定要买最贵最好的,但是一定要选最适合自己的,为了使选择过程更加容易,我提供了一些建议,推荐了几款既适合日常使用又佩戴舒适的热门开放式耳机。 开放式…...
线性代数之线性方程组
目录 线性方程组 1. 解的个数 齐次线性方程组: 非齐次线性方程组: 2. 齐次线性方程组的解 3. 非齐次线性方程组的解 4. 使用 Python 和 NumPy 求解线性方程组 示例代码 齐次线性方程组 非齐次线性方程组 示例结果 齐次线性方程组 非齐次线性…...
速盾:怎么查看是否使用cdn服务?
CDN(Content Delivery Network),即内容分发网络,是一种加速网络内容传输的技术。通过在全球各地建立分布式的节点服务器,将网站的静态资源缓存到最近的节点服务器上,使用户可以从离自己地理位置最近的节点服…...
828华为云征文|采用Flexus云服务器X实例部署RTSP直播服务器
一、前言 这篇文章讲解: 采用华为云最新推出的Flexus云服务器X实例搭建RTSP服务器,完成视频直播需求。 随着实时视频流传输需求的增长,RTSP(实时流协议)服务器成为了许多视频监控、直播和多媒体应用的核心组件。在当…...
Spring Cloud Gateway(二)
Spring Cloud Gateway(二) 文章目录 Spring Cloud Gateway(二)Gateway工作原理为什么使用API网关高并发Gateway性能优化 Gateway工作原理 Spring Cloud Gateway旨在为微服务架构提供简单、有效并且统一的API路由管理方式。它不仅…...
docker 简易入门
# docker 简易入门 docker由几个组成部分 docker client: 即 docker 命令行工具 docker host: 宿主机,docker daemon 的运行环境服务器 docker daemon: docker 的守护进程,docker client 通过命令行与 docker daemon 交互 container: 最小型的一个操…...
【看雪-注册安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
记录一个前端学习小组的收集的模版
问题1:输入“您的姓名”,选择“短答案”作为问题类型。问题2:输入“您是否愿意继续参加前端学习小组?”,选择“单选”作为问题类型,并添加选项“是”和“否”。问题3:输入“如果您选择‘是’&am…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
