Java进阶-反射的详解与应用
本文深入探讨了Java反射机制的核心概念、应用实例及其在现代Java开发中的重要性。文章首先介绍了反射的基本原理和能力,包括在运行时动态获取类信息、操作对象字段和方法的能力。随后,通过具体代码示例,展示了如何利用反射进行字段访问、方法调用、处理泛型方法以及访问私有成员等高级应用,进一步讨论了反射在动态代理、框架开发、数据映射和软件测试中的实用场景。最后,文章总结了反射的优缺点,提出了在实际开发中使用反射的最佳实践和注意事项,为Java开发者提供了一份既全面又深入的反射机制指南。
一、反射的概念
1、反射简介
Java反射是Java语言内建的一种机制,它允许程序在运行时访问、检测和修改它本身的结构。例如,对于任何一个类,反射机制能够告诉我们这个类的所有属性和方法;对于任何一个对象,反射机制能够调用它的任意方法和属性。这种动态获取信息以及动态调用对象方法的功能使得Java应用程序更加灵活,同时也为一些高级特性提供了可能,比如动态代理、依赖注入等。
2、反射基本功能
反射机制主要提供以下功能:
- 在运行时判断任意一个对象所属的类。
- 在运行时构造任意一个类的对象。
- 在运行时判断任意一个类所具有的成员变量和方法(包括私有属性和私有方法)。
- 在运行时调用任意一个对象的方法。
- 生成动态代理。
反射的使用场景包括但不限于:
- 开发通用的框架,如:Spring框架利用反射来实现依赖注入。
- 运行时的类型查询,动态方法调用。
- 编写IDE时,提供类和方法的信息。
然而,反射也存在一些缺点:
- 性能开销:反射操作的性能要慢于直接的代码调用。
- 安全限制:反射需要运行时权限,可能会被安全管理器限制。
- 内部暴露:反射允许代码访问私有方法和属性,可能会破坏封装性。
3、反射原理图
下面是一个反射的基本原理图表示,使用PlantUML代码描述,它展示了Java反射中几个核心类和接口之间的关系:
这个图展示了通过Class
对象如何获取Method
和Field
对象,并且如何通过这些对象对某个Object
实例进行操作。Class.forName(String)
方法用于获取类的Class
对象;Class.newInstance()
方法可以创建类的一个新实例;Class.getMethod()
和Class.getField()
方法分别用于获取类的某个方法和字段的反射对象,之后可以通过Method.invoke()
方法调用对象的方法,通过Field.get()
和Field.set()
方法获取或设置对象的字段值。
4、反射的简单示例
下面的代码给了一个很好的示例:
// 获取String类的Class对象
Class<?> strClass = Class.forName("java.lang.String");// 打印类名
System.out.println("Class name: " + strClass.getName());
我们使用反射的方法获取到了对象的类名。
二、反射的应用
1. 字段反射
字段反射是Java反射机制中非常强大的一部分,它允许程序在运行时访问和修改对象的字段,即便是私有字段。这可以用于多种场合,比如序列化/反序列化库、ORM框架或者是测试框架,其中需要访问对象的私有字段。
① 获取字段值
获取字段值是反射中最基础的操作之一。如上述代码所示,首先通过类的Class
对象获取指定的字段Field
对象。之后,可以通过Field.get(Object)
方法读取具体实例对象的字段值。这种方法使得我们能够读取对象的私有或受保护字段,而不需要通过getter方法。
示例:
class Example {public int value = 5;
}// 获取Example类的Class对象
Class<?> exampleClass = Example.class;// 创建Example的实例
Example exampleInstance = new Example();// 获取字段
Field fieldValue = exampleClass.getField("value");// 获取字段值
int value = (int) fieldValue.get(exampleInstance);System.out.println("Field value: " + value);
Example
类定义了一个公有字段value
。- 使用
Example.class
获取Example
类的Class
对象。 - 利用
getField("value")
方法获取名为"value"的字段。 - 通过
fieldValue.get(exampleInstance)
获取exampleInstance
实例的value
字段的值。
② 修改字段值
修改字段值几乎与获取字段值的过程一致,不同之处在于使用的是Field.set(Object, Object)
方法。这个方法接受两个参数:第一个是要修改的对象实例,第二个是要设置的新值。
示例:
// 使用fieldValue.set()来修改字段值
fieldValue.set(exampleInstance, 10);System.out.println("Modified field value: " + exampleInstance.value);
- 利用
fieldValue.set(exampleInstance, 10)
方法将exampleInstance
实例的value
字段值设置为10。 - 此操作展示了如何使用反射来修改对象的状态,即使是对于公有字段也是如此。
③ 检查字段属性
Java反射还允许我们检查字段的属性(如是否为public、static等)。这是通过Field.getModifiers()
方法完成的,它返回一个整数,表示字段的Java语言修饰符。然后,可以使用Modifier
类中的方法(如isPublic
、isPrivate
等)来解释这些修饰符。
示例:
// 检查字段是否为public
boolean isPublic = Modifier.isPublic(fieldValue.getModifiers());System.out.println("Is the field public? " + isPublic);
- 通过
Modifier.isPublic(fieldValue.getModifiers())
检查value
字段是否为public。 - 这个功能特别有用于动态分析类的结构,或者在创建通用框架和库时需要根据字段的属性做不同的处理。
2. 方法反射
方法反射是Java反射API的另一个核心部分,它允许在运行时动态调用任何类的方法。这种能力对于编写通用代码、框架或工具特别有价值,因为它们可以操作用户定义的类,而无需在编译时知道这些类的具体方法。
① 调用有参方法
调用有参方法示例展示了如何使用反射来调用具有参数的方法。这里的关键步骤包括获取方法的Method
对象,然后使用invoke
方法来执行它。getMethod
方法的参数是要调用的方法名称,以及一个类对象数组,表示方法的参数类型。这使得我们能够精确地指定要调用的方法,特别是在处理重载方法时。
示例:
// 获取方法对象
Method method = strClass.getMethod("substring", int.class, int.class);// 调用方法
Object result = method.invoke("Hello World", 0, 5);System.out.println("Result: " + result);
- 首先,通过
Class.getMethod
获取String
类的substring
方法的Method
对象。该方法接收两个int
类型的参数。 - 然后,使用
Method.invoke
调用该方法。invoke
的第一个参数是要在其上调用方法的对象实例(如果方法是静态的,则为null),后续参数是方法调用的实际参数。 - 这个例子输出"Hello",展示了如何动态地调用方法并处理返回值。
② 访问私有方法
访问私有方法示例展示了如何使用反射来调用类中的私有方法。这是通过Class.getDeclaredMethod
获取Method
对象,并使用setAccessible(true)
来覆盖Java的访问控制检查实现的。这种技术特别有用于测试私有方法或访问第三方库中的私有成员。
示例:
class Example {private void display() {System.out.println("This is a private method.");}
}// 访问私有方法
Method privateMethod = Example.class.getDeclaredMethod("display");
privateMethod.setAccessible(true); // 设置为可访问// 调用方法
privateMethod.invoke(new Example());
- 通过
Example.class.getDeclaredMethod("display")
获取Example
类的私有方法display
的Method
对象。 setAccessible(true)
使得可以访问私有方法。这是一个强大的特性,但也需要谨慎使用,因为它可以绕过Java的访问控制机制。invoke(new Example())
在Example
的新实例上调用私有方法display
。
③ 调用泛型方法
Java中的泛型信息在运行时是被擦除的,这意味着泛型类型参数在编译后变为它们的边界类型(未指定边界的则变为Object)。因此,直接通过反射调用泛型方法时,通常不需要特别处理类型参数。但是,如果需要处理泛型返回类型或参数,可能需要额外的步骤来确保类型安全。
示例代码(模拟):
class Example<T> {public T genericMethod(T input) {return input;}
}// 模拟调用泛型方法
Class<?> exampleClass = Example.class;// 获取泛型方法
Method genericMethod = exampleClass.getMethod("genericMethod", Object.class);// 调用泛型方法,需要进行类型转换
String result = (String) genericMethod.invoke(new Example<String>(), "Hello");System.out.println("Generic method result: " + result);
④ 调用带有输出参数的方法
Java本身不支持输出参数(如C#中的out关键字),但我们可以通过数组或包装类来模拟输出参数的行为。反射调用这样的方法时,需要特别注意传递的参数类型。
示例代码:
class Example {public void outputMethod(String[] output) {output[0] = "Modified by method";}
}// 调用带有输出参数的方法
Class<?> exampleClass = Example.class;
Method outputMethod = exampleClass.getMethod("outputMethod", String[].class);String[] output = new String[1];
outputMethod.invoke(new Example(), (Object)output);System.out.println("Output parameter: " + output[0]);
⑤ 调用重载方法
当一个类中有多个同名方法(方法重载)时,通过反射调用特定的方法需要精确地指定方法的参数类型,以便于getMethod
正确地识别和返回对应的Method
对象。
示例代码:
class Example {public void print(String message) {System.out.println("String version: " + message);}public void print(Integer number) {System.out.println("Integer version: " + number);}
}// 调用重载方法
Class<?> exampleClass = Example.class;// 调用String参数的版本
Method printStringMethod = exampleClass.getMethod("print", String.class);
printStringMethod.invoke(new Example(), "Hello Reflection");// 调用Integer参数的版本
Method printIntegerMethod = exampleClass.getMethod("print", Integer.class);
printIntegerMethod.invoke(new Example(), 123);
三、Java反射总结
1、Java反射的特性
下面是一个关于Java反射的总结表格,包括反射的优点、缺点以及适用场景:
特性 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
动态性 | - 运行时获取类信息 - 动态创建对象 - 动态调用方法 | - 性能开销 - 可能的安全风险 | - 动态代理 - 序列化和反序列化 - 框架开发(如Spring) |
灵活性 | - 代码更加通用和复用 - 可以操作未知类和对象 | - 需要更多的错误处理 - 代码复杂度增加 | - 通用工具库 - 插件架构系统 |
可访问性 | - 可以访问私有成员 - 绕过Java的访问控制 | - 破坏封装性 - 安全限制和风险 | - 测试私有方法 - 访问第三方库的内部结构 |
性能 | - 可以实现复杂和动态的功能 | - 运行时性能损失 - 反射调用比直接调用慢 | - 不频繁执行的操作 - 初始化配置 |
安全性 | - 通过类加载器和安全管理器控制 | - 可能被滥用,访问敏感数据 | - 受控环境 - 信任的代码库 |
- 动态性:Java反射最大的优点是其动态性,使得可以在运行时而非编译时进行类的操作和查询。这对于开发框架和库尤其重要,因为它们需要处理用户定义的类和对象。
- 灵活性:反射提高了代码的灵活性和通用性,允许开发者编写更加通用的代码,这些代码可以自适应不同的数据类型和结构。
- 可访问性:通过反射,代码可以访问和操作私有成员和方法,这在某些特定场景下非常有用,比如在测试框架中测试私有方法。
- 性能:反射的主要缺点是其性能开销。反射操作通常比直接代码调用要慢,因为它们需要在运行时解析关于类和成员的信息。
- 安全性:使用反射时,还需要考虑安全性问题,因为反射可以访问私有和受保护的成员,可能会导致敏感数据泄露或未授权访问。
2、Java反射的应用
以下是一个使用Mermaid语法创建的Java反射应用图,它描述了Java反射的几个主要应用场景,包括动态代理、框架开发、数据映射和测试。
图解说明:
- Java反射:作为起点,Java反射提供了动态访问和操作类的能力。
- 动态代理:反射被用于实现动态代理,允许在运行时动态创建代理对象并处理接口方法调用。
- 框架开发:
- 依赖注入与控制反转:反射使得框架能够实现依赖注入(DI)和控制反转(IoC),自动管理对象的创建和生命周期。
- 动态加载与执行:反射还用于动态加载类和方法,执行框架内的逻辑。
- 数据映射:
- ORM框架:在对象关系映射(ORM)框架中,反射用于映射数据库表到Java对象。
- JSON/XML与对象的转换:在数据格式(如JSON或XML)与Java对象之间转换时,反射用于动态创建对象并设置属性。
- 测试:反射在测试中被用来访问和测试私有方法和属性,使得单元测试能够更加彻底。
这个应用图展示了Java反射技术的强大和多样性,强调了它在现代Java应用程序开发中的关键作用。
3、Java反射总结
Java反射是Java编程语言中一项核心功能,它提供了一种在运行时检查或修改类和对象的能力。这包括了在运行时动态创建对象、调用方法、修改字段值,以及获取类型信息等操作。正因为这种能力,Java反射成为了实现诸如序列化、远程方法调用、测试框架和依赖注入等高级特性的基石。
使用Java反射,开发者能够编写出非常灵活和动态的代码,这些代码可以适用于各种场景,特别是在编写通用框架或库时。反射使得能够操作那些在编写原始代码时未知的类和对象,从而极大地提高了代码的通用性和复用性。
然而,反射也带来了一些挑战和缺点。最主要的是性能问题,因为反射操作相比直接的Java方法调用要慢。这是因为反射需要在运行时解析类或成员的元数据,这个过程涉及到额外的系统资源。因此,反射应当谨慎使用,特别是在性能敏感的应用中。
除了性能外,安全性也是使用反射需要考虑的一个方面。反射可以突破Java的访问控制,访问私有成员。这虽然在某些情况下非常有用(如在测试框架中访问私有方法),但也可能带来安全风险,尤其是在处理不信任的代码时。
尽管存在这些挑战,Java反射仍然是一个强大的工具,它为Java程序提供了极大的灵活性和动态性。为了充分利用反射的优势,同时避免其潜在的问题,开发者需要理解反射的工作原理,以及何时以及如何正确地使用反射。合理地使用反射,可以使你的Java程序不仅更加强大,也更加灵活和可维护。
相关文章:
Java进阶-反射的详解与应用
本文深入探讨了Java反射机制的核心概念、应用实例及其在现代Java开发中的重要性。文章首先介绍了反射的基本原理和能力,包括在运行时动态获取类信息、操作对象字段和方法的能力。随后,通过具体代码示例,展示了如何利用反射进行字段访问、方法…...
蓝桥杯算法题——暴力枚举法
先估算这个数小于3的50次方 cnt0 for i in range(50):for j in range(50):for k in range(50):a3**ib5**jc7**kif a*b*c<59084709587505:cnt1 print(cnt-1)#当ijk都为0时,a*b*c1不是幸运数字所以要减去...
【教程】Kotlin语言学习笔记(六)——泛型
写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 第五章 《L…...
【中文视觉语言模型+本地部署 】23.08 阿里Qwen-VL:能对图片理解、定位物体、读取文字的视觉语言模型 (推理最低12G显存+)
项目主页:https://github.com/QwenLM/Qwen-VL 通义前问网页在线使用——(文本问答,图片理解,文档解析):https://tongyi.aliyun.com/qianwen/ 论文v3. : 一个全能的视觉语言模型 23.10 Qwen-VL: A Versatile…...
【Qt 学习笔记】Qt 背景介绍
博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt 背景介绍 文章编号:Qt 学习笔记 / 01 文章目录 Qt 背景…...
C++递推算法
数塔问题 #include<bits/stdc.h> using namespace std; void f(int,int,int); int a[100][100]; int n; int main() {cin>>n;for(int i0;i<n;i){for(int j0;j<1i;j){cin>>a[i][j];}}for(int in-2;i>0;i--){for(int j0;j<i1;j){a[i][j]a[i][j]ma…...
Go项目结构整洁实现|GitHub 3.5k
一、前言 hi,大家好,这里是白泽。今天给大家分享一个GitHub 🌟 3.5k 的 Go项目:go-backend-clean-arch https://github.com/amitshekhariitbhu/go-backend-clean-architecture 这个项目是一位老外写的,通过一个 HTT…...
Python读取PDF文字 去掉页眉页脚
使用PyMuPDF(即fitz)读取PDF中的text时,会把页码也读进来。所以,有时候就需要让程序忽略页眉和页脚,或者直接删除页眉和页脚。 根据fitz的文档:Page - PyMuPDF 1.24.0 documentation get_text的clip参数可…...
Linux:入门篇
文章目录 前言1. Linuxd的安装环境2.Linux的简单介绍2.1 新建目录2.2 新建文件 3.指令到底是什么?4.shell命令以及运行原理5.总结 前言 很多人对于Linux的学习总是感觉无法下手,不知道从何开始学习,相信这篇文章将会为你提供一个清晰的思路。…...
NSSCTF Round#20 Basic 真亦假,假亦真 CSDN_To_PDF V1.2 出题笔记 (附wp+源码)
真亦假,假亦真 简介:java伪造php一句话马。实则信息泄露一扫就出,flag在/flag里面。 题目描述:开开心心签个到吧,祝各位师傅们好运~ 静态flag:NSS{Checkin_h4v3_4_g00D_tINNe!} /路由显示 <?php e…...
处理关于 React lazy 白屏的两种方案
这篇文章是今天在阅读 React 官方文档的时候看到的一个关于 处理 lazy 体验问题的小技巧,在这里记录一下 当我们使用 React.lazy 去懒加载一个路由组件,在不做任何其他处理的情况下从其他页面首次进入到这个懒加载的路由页面时,肯定会出现白屏…...
Nginx 基础
文章目录 Nginx概念安装下载上传安装包执行准备条件指定安装位置编译和安装启动服务创建启动脚本 linux文件目录nginx运行原理nginx配置域名概念和原理域名配置 Nginx 概念 Nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是…...
C++完美转发(适合小白)
我们知道,C中有左值引用和右值引用,首先我们要知道什么是左值什么是右值。 左值:表达式结束后依然存在的持久对象。左值可以出现在赋值语句的左边或右边。例如,变量和函数返回的引用都是左值。左值通常有持久的地址,可…...
如何创建自己的 Spring Boot Starter 并为其编写单元测试
当我们想要封装一些自定义功能给别人使用的时候,创建Spring Boot Starter的形式是最好的实现方式。如果您还不会构建自己的Spring Boot Starter的话,本文将带你一起创建一个自己的Spring Boot Starter。 快速入门 创建一个新的 Maven 项目。第三方封装的…...
C++ :STL中deque的原理
deque的结构类似于哈希表,使用一个指针数组存储固定大小的数组首地址,当数据分布不均匀时将指针数组内的数据进行偏移,桶不够用的时候会像vector一样扩容然后将之前数组中存储的指针拷贝过来,从原理可以看出deque的性能是非常高的…...
AttributeError: ‘Namespace‘ object has no attribute ‘EarlyStopping‘
报错原因 这个报错信息表明在Python脚本train.py中尝试访问命令行参数args.EarlyStopping时出错,具体错误是AttributeError: Namespace对象没有名为EarlyStopping的属性。 在Python的argparse模块中,当我们通过命令行传递参数并解析时,解析…...
深度学习pytorch——卷积神经网络(持续更新)
计算机如何解析图片? 在计算机的眼中,一张灰度图片,就是许多个数字组成的二维矩阵,每个数字就是此点的像素值(图-1)。在存储时,像素值通常位于[0, 255]区间,在深度学习中࿰…...
【edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法】
edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法 edge浏览器无法登录某些网站,但chrome浏览器可以登录浏览器插件无法使用,比如迅雷如果重装插件重装浏览器重装迅雷后仍然出现问题 edge浏览器无法登录某些网站,但chro…...
OpenHarmony无人机MAVSDK开源库适配方案分享
MAVSDK 是 PX4 开源团队贡献的基于 MavLink 通信协议的用于无人机应用开发的 SDK,支持多种语言如 C/C、python、Java 等。通常用于无人机间、地面站与通信设备的消息传输。 MAVLink 是一种非常轻量级的消息传递协议,用于与无人机(以及机载无…...
模型训练----parser.add_argument添加配置参数
现在需要配置参数来达到修改训练的方式,我现在需要新建一个参数来开关wandb的使用。 首先就是在def parse_option():函数里添加上你要使用的变量名 parser.add_argument("--open_wandb",type bool,defaultFalse,helpopen wandb) 到config文件里增加你的…...
数字未来:探索 Web3 的革命性潜力
在当今数字化的时代,Web3作为互联网的新兴范式正逐渐崭露头角,引发了广泛的关注和探讨。本文将深入探索数字未来中Web3所蕴含的革命性潜力,探讨其对社会、经济和技术的深远影响。 1. Web3:数字世界的下一个阶段 Web3是一个正在崛…...
群晖NAS使用Docker部署大语言模型Llama 2结合内网穿透实现公网访问本地GPT聊天服务
文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛,包括聊天机…...
[选型必备基础信息] 存储器
存储芯片根据断电后是否保留存储的信息可分为易失性存储芯片(RAM)和非易失性存储芯片(ROM)。 简单说,存储类IC分为 ROM和RAM ROM:EEPROM / Flash / eMMC RAM:SRAM/SDRAM/DDR2/DDR3/DDR4/DDR5…...
C++——C++11线程库
目录 一,线程库简介 二,线程库简单使用 2.1 传函数指针 编辑 2.2 传lamdba表达式 2.3 简单综合运用 2.4 线程函数参数 三,线程安全问题 3.1 为什么会有这个问题? 3.2 锁 3.2.1 互斥锁 3.2.2 递归锁 3.3 原子操作 3…...
机器学习 | 线性判别分析(Linear Discriminant Analysis)
1 机器学习中的建模 1.1 描述性建模 以方便的形式给出数据的主要特征,实质上是对数据的概括,以便在大量的或有噪声的数据中仍能观察到重要特征。重在认识数据的主要概貌,理解数据的重要特征。 Task:聚类分析,数据降…...
TypeScript-数组、函数类型
1.数组类型 1.1类型 方括号 let arry:number[][5,2,0,1,3,1,4] 1.2 数组泛型 let arry2:Array<number>[5,2,0,1,3,1,4] 1.3接口类型 interface makeArryRule{[index:number]:number }let arry3:makeArryRule[5,2,0,1,3,1,4] 1.4伪数组 说明: argument…...
Python深度学习034:cuda的环境如何配置
文章目录 1.安装nvidia cuda驱动CMD中看一下cuda版本:下载并安装cuda驱动2.创建虚拟环境并安装pytorch的torch_cuda3.测试附录1.安装nvidia cuda驱动 CMD中看一下cuda版本: 注意: 红框的cuda版本,是你的显卡能装的最高的cuda版本,所以可以选择低于它的版本。比如我的是11…...
【论文笔记】Text2QR
论文:Text2QR: Harmonizing Aesthetic Customization and Scanning Robustness for Text-Guided QR Code Generation Abstract 二维码通常包含很多信息但看起来并不美观。stable diffusion的出现让平衡扫描鲁棒性和美观变为可能。 为了保证美观二维码的稳定生成&a…...
【ReadPapers】A Survey of Large Language Models
LLM-Survey的llm能力和评估部分内容学习笔记——思维导图 思维导图 参考资料 A Survey of Large Language Models论文的github仓库...
站群CMS系统
站群CMS系统是一种用于批量建立和管理网站的内容管理系统,它能够帮助用户快速创建大量的网站,并实现对这些网站的集中管理。以下是三个在使用广泛的站群CMS系统,它们各具特色,可以满足不同用户的需求。 1. Z-BlogPHP Z-BlogPHP是…...
wordpress 主题分享/app推广
一、硬件材料 1*Arduino UNO开发板 1*GSP30 1*0.96寸OLED液晶显示屏 二、硬件接线图 CSDN 赤鱼科技...
seo 排名/seo观察网
当当当~时光荏苒,岁月如梭,年终将至,有些财年节点设置在自然年底的公司,已经开始一年一度的升职加薪年终总结了。项目经理每天在客户现场背锅填坑沟通协调记录、整理和分析已经不易,再提取亮点和价值可能更无从下手。因…...
兰州彩票网站制作/聊城网站seo
微信小程序 MD5的方法详解生成的文件可以放在 utils文件中哦!!!/** A JavaScript implementation of the RSA Data Security, Inc. MD5 Message* Digest Algorithm, as defined in RFC 1321.* Version 1.1 Copyright (C) Paul Johnston 1999…...
真做视频网站/百度推广登录页面
1、Python有两种提示符(>>>)和次提示符(…)。主提示符是解释器告诉你它在等待你输入下一个语句,次提示符告诉你解释器正在等待你输入当前语句的其他部分。 2、Python有两种主要的方式来完成你的要求ÿ…...
衢州建设公司网站/小红书代运营
心情良好转载于:https://www.cnblogs.com/qq3111901846/p/6178722.html...
枣庄手机网站建设报价/爱站网关键词查询系统
百度地图api2.4.1 在发起步行路径检索的时候 onGetWalkingRouteResult回调方法中的结果总是空的,即使直接复制api的代码也不对。坐标我是用的百度地图的拾取坐标系统获取的坐标。开始的代码double cLat112.556305;double cLon32.975724;double cLat2112.560727;doub…...