
Java
文章平均质量分 79
Java 技术在 SAP 产品中的应用
汪子熙
18年深耕企业管理软件领域,精通 ABAP, Java, Javascript, Typescript, 精通 UI5, Fiori, Fiori Element, Angular, Kubernetes, SAP HANA, SAP BTP. 具有通过阅读 Github 上各种优秀的开源框架和工具源代码的习惯,对于我来说阅读源代码,就像阅读中国白话文一样轻松自然。
展开
-
日志分析助力 CRM 模块问题定位与修复实践
由此可以看出,系统接收到的索引值为 2,而系统中仅有两个客户记录,正常的索引应该为 0 或 1。经过仔细分析日志,经过反复推敲和逻辑推理,最终锁定到代码在处理特殊边界情况时存在疏漏,未能正确处理当传入的索引正好等于客户数据列表长度时的情形。结合日志信息和代码分析,开发人员推断系统在接收到索引值正好等于客户列表长度的场景下,应当将这一情况视为新增客户记录的操作,而不是更新已有记录。新的代码在函数内部增加了判断,当索引值等于列表长度时,便将新的数据追加到客户列表中,而非尝试更新不存在的记录。原创 2025-03-17 10:03:03 · 398 阅读 · 0 评论 -
什么是 Eclipse 的 Working sets 概念
在实际项目开发中,不同阶段的工作内容可能大相径庭。与此同时,工作集功能还可以与 Eclipse 的其他插件无缝集成,构建出一个高效、灵活、模块化的开发环境,这正是现代软件工程中对生产力工具不断追求的体现。此外,工作集机制还可以辅助构建特定的构建和部署流程,在自动化脚本或插件开发中,利用工作集对目标资源进行精准过滤,从而实现高效的持续集成与交付。开发者在实际开发过程中,可以利用这些 API 实现对工作集的动态管理,例如创建新的工作集、修改现有工作集的内容,甚至可以构建自定义插件来优化工作流管理。原创 2025-03-13 18:03:21 · 554 阅读 · 0 评论 -
深入探讨 javax.net.ssl.SSLException: Unsupported or unrecognized SSL message 错误原因与解决方案
在下文中,我们将以深入分析的角度,从 JVM 和字节码层面探讨错误发生的原因,并结合现实生活中容易理解的案例来说明问题的根本。类似地,当客户端连接到错误端口时,服务器返回的 HTTP 响应消息就好似传递了一张完全不相干的卡片,这张卡片的格式与双方约定的握手信号完全不符,所以客户端的 SSL/TLS 解析模块便会抛出。如果在建立 SSL/TLS 连接时错误地指定了 HTTP 端口,那么服务器返回的将是纯文本的 HTTP 消息,无法被 SSL/TLS 解析,因此抛出异常。原创 2025-02-27 18:14:19 · 932 阅读 · 0 评论 -
深入探究 Java 应用日志中的 Starting ProtocolHandler [http-nio-9001] 启动机制
除此之外,借助 JVM 提供的监控工具,例如 JConsole、VisualVM 等,运维人员能够观察到 JVM 内部线程、内存分配、垃圾回收等运行情况,这与 ProtocolHandler 的启动与运行密切相关。字节码包含了所有需要在 JVM 上运行的指令,实际上,这个过程类似于翻译一本书,由作者的原始语言转化为机器可以理解的符号体系。从类加载器加载字节码、执行构造函数,到 JVM 对热点代码的即时编译,再到 NIO 模型下的多路复用技术,每个环节都体现了 Java 平台在高并发网络通信领域的深厚积淀。原创 2025-02-25 21:46:09 · 931 阅读 · 0 评论 -
解析 Eclipse 弹出 Internal Error 并全面解决问题
这个问题表面上看是文件权限问题,但其根源可能涉及多个方面。从操作系统到软件配置再到用户操作,每一环节都可能影响结果。通过系统化的分析和逐步验证,我们可以有效定位问题并找到合适的解决方案。同时,遵循良好的开发环境管理实践,可以从根本上降低类似问题的发生概率。原创 2025-01-17 15:14:20 · 1101 阅读 · 0 评论 -
深入解析 java.net.UnknownHostException 异常及其解决方法
是 Java 中的一种受检异常,属于java.net包。当应用程序试图通过主机名(如)进行网络连接时,Java 需要通过域名系统(DNS)将主机名解析为 IP 地址。如果这个解析过程失败,就会抛出此异常。异常看似简单,但其背后的技术原理涉及到主机名解析、DNS 查询以及 JVM 的运行机制等多个方面。通过对异常机制的深入剖析和现实案例的结合,我们可以更加全面地理解并应对这一常见问题。在开发实际应用时,遵循良好的编码实践,并妥善处理异常,是提升程序健壮性的重要手段。原创 2024-12-19 11:50:01 · 2171 阅读 · 0 评论 -
深入解析 Java 异常 `java.io.IOException: java.util.concurrent.ExecutionException` 及解决方案
是一种复杂但可控的异常。通过理解其底层机制和上下文,结合重试、日志记录等策略,可以显著提高系统的健壮性与容错能力。原创 2024-12-19 11:45:13 · 963 阅读 · 0 评论 -
解决 Java 错误 gethostname encountered invalid UTF-8 的技术分析与调试指南
错误通常是由操作系统返回的无效 UTF-8 字符导致的。这种情况可能发生在操作系统的主机名配置不正确,或者 JVM 在处理字符编码时出现问题时。通过检查操作系统设置、调整 JVM 字符编码设置以及使用替代方法获取主机名,我们可以有效地解决这一问题。原创 2024-12-11 17:45:30 · 827 阅读 · 0 评论 -
深入解析 Java 中的 gethostname 方法:从技术原理到实际应用
从技术角度来看,Java 中的方法是通过底层操作系统的网络接口来实现的。通过,Java 程序能够方便地获取当前机器的主机名,而这一操作在底层则依赖于操作系统提供的或等接口。在 JVM 层面,这个操作通过 JNI 调用本地方法,最终实现主机名的获取。在实际应用中,获取主机名有许多用处。例如,在分布式系统中,每台机器的主机名可以作为标识符用于服务注册与发现;在网络管理中,主机名也可以用来简化配置和排错。原创 2024-12-11 17:44:57 · 998 阅读 · 0 评论 -
JDK 21 中虚拟线程是否能够完全代替传统线程的技术分析
Java 自从引入虚拟线程 (Virtual Threads) 以来,极大地改变了开发者处理并发任务的方式。在 JDK 21 中,虚拟线程进一步完善,给开发者带来了新的工具去优化应用性能和代码简洁性。但是,虚拟线程是否能够完全代替传统线程呢?原创 2024-12-11 17:44:01 · 856 阅读 · 0 评论 -
Java 泛型中的通配符:一篇文章彻底讲清楚 <? extends T> 和 <? super T>
Java 语言作为一种静态强类型语言,在设计过程中必须平衡类型安全、灵活性以及代码的可复用性。泛型机制便是 Java 在 1.5 版本中引入的强大工具,旨在实现类型安全的集合操作及代码的通用化。原创 2024-12-05 18:55:11 · 1190 阅读 · 0 评论 -
JamaicaVM:Java 虚拟机的实时革命
Java 虚拟机 (JVM) 是 Java 应用程序运行的核心组件。Java 代码在编译之后会生成字节码,字节码是一种中间表示,不是直接由硬件执行的机器码。JVM 通过将这些字节码翻译成机器码来实现程序的跨平台性。加载字节码:当 Java 程序启动时,JVM 会加载编译后的.class文件中的字节码到内存中。字节码验证:JVM 通过字节码验证器,确保字节码是安全的,不会破坏系统的稳定性。执行:JVM 采用解释器或者即时编译器 (JIT) 将字节码转换为机器码,并交由硬件执行。原创 2024-12-03 19:04:11 · 783 阅读 · 0 评论 -
深入理解 Java ScheduledExecutorService 的用法与技术原理
是 Java 5 中引入的包的一部分,用于替代传统的基于线程的任务调度方法,例如Timer和TimerTask。它提供了线程池机制,专门用于执行延迟或定时执行的任务。通过这种方式,我们可以避免单线程调度中遇到的各种问题,例如线程意外终止、无故延迟等。:在指定的延迟之后执行一次任务。:在初始延迟后,以固定的时间间隔重复执行任务。:在初始延迟后执行任务,然后每次任务执行完成后再等待一段时间,再次执行。这些方法提供了高效且灵活的方式来调度任务。原创 2024-12-03 19:02:12 · 646 阅读 · 0 评论 -
Java 任务调度精度问题及优化方法的深入分析
Java 中的任务调度器例如在定时任务执行时确实存在一定误差,尤其是在需要高精度的业务场景下。例如,如果你需要一个任务精确地每 100 毫秒执行一次,那么你可能会发现使用时,每次任务的执行时间有可能提前几毫秒或者延后几毫秒,甚至偶尔会有几十毫秒的偏差。对于某些场景,这样的误差可能是完全可以接受的,但如果你的业务需求对定时的准确性非常敏感,那么就需要寻求更加精确的解决方案了。原创 2024-12-03 19:01:09 · 674 阅读 · 0 评论 -
如何将 Java Web 应用 Docker 容器化并部署到 Kubernetes 集群中
到这里,我们已经通过 Docker 将一个 Java Web 应用进行了容器化,并将其部署到了 Kubernetes 集群中。在这个过程中,我们不仅创建了镜像和容器,还配置了 Kubernetes 的 Deployment 和 Service,确保应用可以高效扩展并对外提供服务。同时,通过水平自动扩展和自愈功能,保障了应用的高可用性和灵活的资源利用率。原创 2024-12-02 18:57:35 · 783 阅读 · 0 评论 -
探索 JVM:开发者无法忽视的核心技术之内幕解密
JVM,即 Java Virtual Machine,中文叫做 Java 虚拟机。简单来说,JVM 是一种虚拟的计算机环境,它能运行 Java 字节码。Java 源代码被编译为字节码文件,这些字节码文件便由 JVM 来执行。我们可以将 JVM 想象为一个解释器,它负责将通用的 Java 字节码转变成具体的操作系统指令,使代码可以跨平台执行。举个简单的现实例子来理解 JVM 的作用:想象你是一位旅行者,来到一个陌生的国家,而那里的人们说着你完全不懂的语言。原创 2024-12-02 18:54:44 · 962 阅读 · 0 评论 -
Java 反序列化漏洞的深度分析及其潜在威胁
反序列化是 Java 中将字节流转换为 Java 对象的过程。通常,序列化是将对象转换为字节流,而反序列化则是将字节流还原为对象。为了让读者更直观地理解,可以将序列化与反序列化过程类比于现实生活中的“快递服务”:序列化就像是将一个物品(对象)打包成一个快递包裹(字节流),以便于运输(网络传输或存储);反序列化则是将这个快递包裹拆包,恢复出原来的物品。在 Java 中,对象的序列化与反序列化通常依赖于接口。原创 2024-11-26 12:11:30 · 709 阅读 · 0 评论 -
while(true) 在 Java 中的应用:深入分析及 JVM 视角的探索
的最常见用途就是构建无限循环,其通常出现在服务器的后台服务或实时处理程序中,例如不断监听来自客户端的请求,监视一个文件夹的变化,或者是其他需要持续运行的服务。例如,当 JIT 发现一个循环没有明确的退出条件时,它会通过优化手段来提高效率,例如指令的重排序和移除冗余操作。的使用在 Java 编程中一直存在争议,从性能的角度看,它并不落后,且 JVM 能够对其进行有效的优化。等)可以更好地解决这类问题,通过线程池和任务队列来管理任务的执行,使得开发者不需要手动控制线程的生命周期,也避免了低效的。原创 2024-11-26 12:10:20 · 816 阅读 · 0 评论 -
failed to connect to zk for get of /hbase/meta-region-server, retries = 25
错误通常是由于客户端无法连接到 Zookeeper,或者无法获取到 HBase 的元数据信息引起的。通过检查 Zookeeper 服务状态、验证配置、测试网络连接、查看节点数据等方法,可以有效地定位并解决问题。原创 2024-11-25 12:04:51 · 1176 阅读 · 0 评论 -
Eclipse 无法启动 app.java 的可能原因及解决方案
案例分析:*曾有开发者在使用 Eclipse 开发 HBase 应用时,忘记将 HBase 的客户端 jar 包添加到项目的构建路径中,结果导致在运行时抛出。Hadoop 和 HBase 可能在系统环境变量中配置了特定的路径,但 Eclipse 运行时未能识别这些环境变量,导致程序无法正常运行。如果 Eclipse 中运行的 JVM 分配的内存不足,可能会导致程序在运行时出现。不同版本的 Hadoop 和 HBase 可能依赖不同版本的库,如果在 Eclipse 中引用了错误的版本,可能导致类加载冲突。原创 2024-11-24 22:55:45 · 895 阅读 · 0 评论 -
浅谈 Java 无状态方法的并发调用安全性问题
在讨论原理之前,我们需要清楚什么是无状态方法。无状态方法是指不存储任何与实例相关的状态数据的方法。换句话说,这样的方法不会更改对象的状态,不依赖于实例变量,只操作方法参数或局部变量。例如,下面的add这里的add方法不依赖任何类的成员变量,也没有对外部状态进行操作。它只使用传入的参数,并返回计算结果。这个increment方法使用了counter这个成员变量,这意味着多个线程在并发执行increment时会同时访问和修改counter,从而产生数据竞态问题。原创 2024-11-24 22:52:52 · 998 阅读 · 0 评论 -
Eclipse Secure Storage:安全数据存储的实现与应用
Eclipse Secure Storage 是 Eclipse 集成开发环境(IDE)中的一个用于安全存储敏感数据的组件。它的主要作用是以加密方式存储用户的认证信息和配置文件中的其他机密数据,比如 API 密钥、密码、证书等。Secure Storage 提供了一个便捷而安全的方式来管理这些需要保护的信息,而不用每次手动输入或担心被未授权的人访问。原创 2024-11-17 16:30:30 · 1103 阅读 · 0 评论 -
IntelliJ IDEA 与 Eclipse 的深入比较:从技术原理到用户体验的全景剖析
IntelliJ IDEA 是由 JetBrains 开发的一款广泛应用于 Java 开发的商业 IDE。它因其智能的代码补全、全面的调试功能以及对多种开发工具的无缝集成而备受好评。而 Eclipse 则是由 Eclipse 基金会推出的开源 IDE,它以开放、自由和高度可扩展性著称。对于 Java 开发者而言,这两款工具都有各自独特的优势。例如,Eclipse 的开源特性使得它可以方便地被各种插件拓展,无论是用于 Java 还是其他编程语言。原创 2024-11-17 16:25:57 · 1945 阅读 · 0 评论 -
什么是 Eclipse virtualFS
virtualFS,即 Virtual File System,直译为虚拟文件系统。在 Eclipse 的背景下,virtualFS 是一个用于管理项目中文件资源的逻辑结构。它不直接操作物理文件系统,而是通过抽象和虚拟化机制,让用户可以在更高层次上对文件和文件夹进行管理。这种虚拟化的方法使 Eclipse 具备了更多灵活的功能,如支持不同的文件系统,跨平台兼容,甚至集成远程资源。Eclipse 的 virtualFS 是一个强大的虚拟文件系统,它通过抽象底层文件系统,为开发者提供了灵活的资源管理方式。原创 2024-11-11 18:57:06 · 906 阅读 · 0 评论 -
分布使用synchronized关键字和AtomicInteger进行线程同步的例子
package atomicIntegerTest;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.atomic.AtomicInteger;import org.junit.Test;public class ...原创 2020-04-26 20:55:37 · 336 阅读 · 1 评论 -
jMeter 里如何调用函数 function
jMeter 线程组的 loop count -1,等价于把 infinite 勾上。jMeter 里函数调用的语法:${__time(YMD)}两个下划线,后跟函数名,小括号内是输入参数,整个用大括号包裹。最后效果:${__threadNum}threadNum 的含义是当前线程在整个线程组里的编号,而不是线程总数。JMeter 函数是特殊值,可以填充任何 Sampler 或测试树中其他元素的字段。 函数调用如下所示:${__functionName(var1,var2,var原创 2021-10-01 13:48:00 · 645 阅读 · 0 评论 -
Java 泛型在实际项目开发中的应用
Java 的泛型通过类型参数化为代码提供了更高的灵活性和类型安全性。它在集合框架、工具类、接口设计和大型框架(如 Spring 和 Hibernate)中得到了广泛应用。通过类型擦除机制,Java 保留了向下兼容性,尽管这也带来了一些局限性。理解泛型的编译时与运行时行为对于编写高效、类型安全的代码至关重要。在实际项目中,泛型不仅提高了代码的可复用性,还减少了运行时类型转换错误的发生,特别是在处理集合类和通用算法时。通过对泛型的深入理解,开发者可以编写出更具扩展性和维护性的 Java 代码。原创 2024-10-10 23:02:46 · 986 阅读 · 0 评论 -
Java 中 synchronized 和 Thread 的使用场合介绍
在 Java 编程中,和Thread是处理并发与多线程编程的关键工具。多线程编程是为了在单一程序中并行执行多个任务,Java 提供了丰富的 API 和关键字以实现这一目标,而其中和Thread是非常基础和重要的部分。原创 2024-09-30 12:16:21 · 1089 阅读 · 0 评论 -
Java 为什么使用 UTF-16 而不是更节省内存的 UTF-8?
Java 选择 UTF-16 而不是 UTF-8 的决定,涉及到多个层面的考虑,包括字符处理的简单性、跨平台的一致性、性能优化以及历史背景。虽然 UTF-8 能够在某些情况下节省内存,但对于 JVM 来说,UTF-16 的定长特性能够简化字符串操作逻辑,提升整体性能,并确保不同平台上的一致性表现。这一选择在处理多语言应用时尤为明显,尤其是在需要频繁进行字符串操作的应用中,UTF-16 能够提供更高的效率和更好的用户体验。原创 2024-09-30 12:08:38 · 984 阅读 · 0 评论 -
使用 Fiddler 为满足某些特定格式的网络请求返回 mock 响应
假设我想对本地Java程序发起的调用SAP Hybris web service https://jerrywang.com:9002/rest/v2/electronics/users/ 这个网络请求生成一个mock响应。在Fiddler session监控列表里,找到要生成mock响应的请求,进入AutoResponder标签页,将Enable rules前面的勾选中,创建一条新的rule,...原创 2019-12-20 19:11:19 · 491 阅读 · 1 评论 -
如何设置Fiddler来拦截Java代码发送的HTTP请求,进行各种问题排查
我们使用Java的RestTemplate或者Apache的HTTPClient编程的时候,经常遇到需要跟踪Java代码发送的HTTP请求明细的情况。和javascript代码在浏览器里发送请求可以通过Chrome开发者工具方便地跟踪一样,对于Java代码发送的网络请求,我们也可以使用工具Fiddler来监控。打开Fiddler,在connections面板里找到Fiddler监听的端口号88...原创 2019-12-20 18:20:45 · 1304 阅读 · 0 评论 -
使用Java消费API的一个错误消息PKIX path building failed以及解决方案
我使用Java代码消费一个网站的Restful API,遇到如下错误:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target只需要将该网站的证书从浏览器导出...原创 2019-12-15 18:07:41 · 608 阅读 · 1 评论 -
Oracle 要对 Java 收费了,SAP 基于 Java 技术栈的那些产品的客户怎么办
今年年初的时候,所谓“Oracle要对Java收费”的新闻,在网上传得沸沸扬扬。这个新闻被专业人士视为标题党,而国内众多技术论坛,比如知乎社区上,有很多大神对“Java收费”这个说法做出了非常专业的解读,Jerry这里就不班门弄斧了,Bing搜索引擎根据“Oracle Java收费”的关键字搜索,第一条搜索结果就值得阅读。Jerry本文想扫盲的重点,是介绍JDK,Oracle JDK, Open JDK和SAP JDK这几个名词的关系。原创 2019-11-04 10:38:42 · 639 阅读 · 0 评论 -
如何使用jMeter发送两个逻辑上相关的HTTP请求
在前一篇文章使用jMeter构造大量并发的随机HTTP请求里我通过jMeter构造了大量的HTTP GET并发请求,对服务器产生了大量读操作。现在我有另一个需求场景:假设我开发了一个**创建**Service Request的微服务,需要使用HTTP post调用。为了防止Cross Site Request Forgery(跨站域请求伪造),这个微服务调用时需要传一个XSRF token,这...原创 2018-04-28 09:50:44 · 438 阅读 · 0 评论 -
使用工具Source Monitor测量您Java代码的环复杂度
代码的环复杂度(Cyclomatic complexity,有时也翻译成圈复杂度)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出。来看看计算公式。代码环复杂度 = E − N + 2E = 程序控制流图中边的个数N = 程序控制流图中点的个数很容易得出这样的结论:代码环复杂度越高,越容易出bug。可以想象如果需要开发人员自己去...原创 2024-10-23 15:35:55 · 2869 阅读 · 0 评论 -
使用JDK自带的VisualVM进行Java程序的性能分析
VisualVM是什么?VisualVM是JDK自带的一个用于Java程序性能分析的工具,JDK安装完毕后就有啦,在JDK安装目录的bin文件夹下能找到名称为jvisualvm.exe。要使用VisualVM分析您的应用性能,首先得让VisualVM识别出您的应用。Eclipse有个插件名叫“VisualVM Launcher for Eclipse”,可以帮助我们做到这一点。...原创 2018-08-14 18:49:11 · 450 阅读 · 0 评论 -
Java动态代理之InvocationHandler最简单的入门教程
网上关于Java的动态代理,Proxy和InvocationHandler这些概念有讲解得非常高深的文章。其实这些概念没有那么复杂。现在咱们通过一个最简单的例子认识什么是InvocationHandler。值得一提的是,InvocationHandler在Spring框架实现中被广泛使用,这意味着我们吃透了InvocationHandler,就为将来的Spring源码学习打下一个坚实的基础。...原创 2018-08-15 11:46:28 · 8000 阅读 · 0 评论 -
Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序
文章的标题看似自相矛盾,然而我在“正确”二字上打了引号。我们来看一个例子,关于Java异常处理(Exception Handling)的一些知识点。看下面这段程序。方法pleaseThrow接受一个Exception的实例,然后简单地将该实例抛出。然后调用这个方法时,我传入了一个SQLException的实例。因为pleaseThrow的调用包裹在一个try catch块里,问题:pl...原创 2018-08-27 12:05:41 · 1158 阅读 · 0 评论 -
一个具体的例子学习Java volatile关键字
相信大多数Java程序员都学习过volatile这个关键字的用法。百度百科上对volatile的定义:volatile是一个类型修饰符(type specifier),被设计用来修饰被不同线程访问和修改的变量。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。可能有很多刚学Java的朋友们看了上面这段非常笼统的描述后仍然觉得云里雾里的。下...原创 2018-08-20 12:19:47 · 323 阅读 · 1 评论 -
使用JDK自带的工具jstack找出造成运行程序死锁的原因
Java多线程编程也是Java面试中经常考察的内容。刚接触Java多线程编程的朋友们,可能会不慎写出一些会导致死锁(deadlock)的应用出来。如何分析造成Java多线程的原因呢?很多时候我们在怀疑造成死锁的语句设置断点,单步调试,反而又不能重现了。这种现象很正常,因为咱们单步调试和直接运行程序,代码执行的时序是不同的,很可能无法满足死锁的触发条件。实际上,JDK已经给Java程序员提供...原创 2018-08-23 12:16:28 · 819 阅读 · 0 评论