Java

本期视频:https://www.bilibili.com/video/BV1YY4y1a7vG 在Java 18中,将UTF-8指定为标准Java API的默认字符集。有了这一更改,依赖于默认字符集的API将在所有实现、操作系统、区域设置和配置中保持一致。 做这一更改的主要目标: 当Java程序的代码依赖于默认字符集时,使其更具可预测性和可移植性。 阐明标准Java API在哪里使用默认字符集。 在整个标准Java API中对UTF-8进行标准化,但控制台I/O除外。 需要注意的是,这一更改的目标并不是定义新的标准Java API或受支持的JDK API,尽管这项工作可能会发现新的便利方法可能会使现有的API更易于使用,这一更改并不是要弃用或删除依赖默认字符集的标准Java API。 动机用于读写文件和处理文本的标准Java API允许将字符集作为参数传递。字符集控制Java编...

昨天分享了Java 18 新特性:简单Web服务器的jwebserver命令行功能。今天换一种方式,使用Java代码来实现一个静态资源服务器。 详细步骤我录了个视频放到B站了,感兴趣的小伙伴可以点击查看Java 18 新特性:Simple Web Server(2) 代码比较简单,直接贴出来了: public class Main { public static void main(String[] args) { System.out.println("Hello world!"); var addr = new InetSocketAddress(9000); var server = SimpleFileServer.createFileServer( addr, Path.of(...

在今年3月下旬的时候,Java已经更新到了18。接下来会挑一些有意思的内容,以文章和视频的方式来给大家介绍和学习。 如果要第一时间获得内容更新,对文章形式感兴趣的小伙伴可以关注我的博客或者公众号(程序猿DD),对视频形式感兴趣的可以关注我的B站或视频号(程序猿DD)。 本篇内容对应视频已完成录制,点击查看:Java 18 新特性:Simple Web Server(1) 简单Web服务器:jwebserverJEP 408: Simple Web Server,是这次Java 18推出的一个比较独立的全新功能点。我们可以通过命令行工具来启动一个提供静态资源访问的迷你Web服务器。 该工具的定位官方文档中说了一堆: 这里我简单总结几点,方便大家理解: 构建目的是应用于测试与教学,不是为了替代Jetty、Nginx等高级服务器 不提供身份验证、访问控制或加密等安全功能 仅支持HTTP...

最新消息!根据Log4j官网发布,2.17.0版本还存在漏洞! 上图来自Log4j2官网:https://logging.apache.org/log4j/2.x/ 漏洞编号:CVE-2021-44832 漏洞内容:Log4j2提供的JDBCAppender功能,将日志信息写入数据库中,这个过程需要JNDI的支持,故攻击者可以利用此来执行任意代码。 危害等级:中 影响范围:2.17.0及以下版本(不包含2.12.4、2.3.2) 修复措施:升级Log4j2的版本 Java 8或之后用户升级到最新的2.17.1 Java 7用户升级到2.12.4 Java 6用户升级到2.3.2 这个漏洞跟之前曝出的Logback漏洞类似,因为存在苛刻的利用条件,所以危害并不是很大。也许后面你马上会看到很多来自营销号危言耸天的标题,希望你可以冷静看待,不必慌张… 点赞,转发,让更多人知道本质,不...

本以为,经过上周的2.16.0版本升级,Log4j2的漏洞修复工作,大家基本都要告一段落了。 万万没想到,就在周末,Log4j官方又发布了新版本:2.17.0 该版本主要修复安全漏洞:CVE-2021-45105 影响版本:2.0-alpha1 至 2.16.0(1.x用户继续忽略) 该漏洞只有当日志配置使用带有Context Lookups的非默认 Pattern Layout(例如$${ctx:loginId})时,攻击者可以通过构造包含递归查找的恶意输入数据,触发无限循环,导致 StackOverflowError,最终进程崩溃。 这次漏洞受影响的只有log4j-core,仅使用log4j-api的程序不需要担心。所以,大家可以通过升级log4j-core来修复该漏洞的 <dependency> <groupId>org.apache.logg...

昨天,Apache Log4j 团队再次发布了新版本:2.16.0! 2.16.0 更新内容 默认禁用JNDI的访问,用户需要通过配置log4j2.enableJndi参数开启 默认允许协议限制为:java、ldap、ldaps,并将ldap协议限制为仅可访问Java原始对象 Message Lookups被完全移除,加固漏洞的防御 更多细节,可以通过官网查看:https://logging.apache.org/log4j/2.x/ 如果您正在学习Spring Boot,那么推荐一个连载多年还在继续更新的免费教程:https://blog.didispace.com/spring-boot-learning-2x/ Spring Boot用户如何升级Spring Boot用户依然可以通过前几天分享的Spring Boot应用简易升级Spring Boot下所有log4j版本的...

Java 13在2019年9月发布,这个版本引入的正式可用特性几乎没有,是我认为最无聊的版本之一。所以我们跳过Java 13直接来看Java 14吧。 Switch表达式我觉得switch表达式在日常中开发被使用的太少了,不是因为这个关键字和if比起来太“难”,而是因为它很冗长,而且这种视觉上的噪声容易掩盖那些难以调试的错误,特别是那些break语句,就像下面这样: switch (day) { case MONDAY: case FRIDAY: case SUNDAY: System.out.println(6); break; case TUESDAY: System.out.println(7); break; case THURSDAY: case SATURDAY: ...

上一篇说完了Java11的新特性,本篇接着说一下Java12.Java 12 对开发者有用的特性并不是特别多,不过实用性还是有的。 字符串增强Java 12 进一步对字符串操作进行增强,增加了两个方法。 字符串缩进String indent(int n) 会根据参数n对字符串进行缩进。具体的规则是 当n>0时,会在字符串的每一行开头插入n个空格,字符串整体右移。 当n<0时,会在字符串的每一行开头删除n个空格,如果实际的空格数小于n,删除该行所有空格,但是并不会换行。 来实验一下: String text = " Hello \n Java12";System.out.println("缩进前");System.out.println(text);System.out.println("右缩进俩字符");String indent2 = text.indent(2);...

10月的TIOBE编程语言排行榜发布了最新一期榜单,雄踞榜首多年的Java终于让出了榜首位置,Python成功登顶。一时间,关于Python的吹捧与对Java的看衰持续引发热议。“世界上只有两种编程语言,一种广为诟病,另一种没人用”。C++之父的这句名言用来形容Java同样合适,作为企业级的编程语言,Java不仅在中国互联网大厂中有着广泛的应用,在世界范围内更是有着庞大的生态和就业机会。 编程语言之争是技术圈经久不衰的话题,国内开发者培训业务多了起来以后,关于编程语言的话题炒作更是此起彼伏。但雄踞榜首多年,Java的下滑也并非空穴来风,而是有其深刻的历史背景所在。这个背景,或许就是云原生时代的来临。 以容器为代表的云原生技术或者说理念,有着弹性可扩展、松耦合、容错性好、易于管理、解放运维、可频繁变更的优势,这极大地降低了开发部署的门槛,让云计算大大地往前、向下走了一步。这本该是一次编...

Java 11是自Java 8以来的又一个LTS版本,是目前全球使用最多的LTS版本之一。今天我们接着在Java 9 到 Java 17系列文章中来认识针对普通开发者的Java 11。 字符串API增强在Java 11中,针对String的操作进一步得到加强。避免我们在很常见的场景中引入额外的、复杂的API。 isBlank()用来判断字符串是不是空字符""或者trim()之后(" ")为空字符: String blankStr = " ";// trueboolean trueVal = blankStr.isBlank(); lines()将一个字符串按照行终止符(换行符\n或者回车符\r)进行分割,并将分割为Stream流: String newStr = "Hello Java 11 \n felord.cn \r 2021-09...

在上一篇我们对Java 9的新特性进行了一些回顾,今天接着来看看Java 10带来了什么特性。之所以需要把Java 8 到Java 17的特性归纳一遍,因为Java社区对Java 17的重视程度前所未有。话不多说,让我们走进Java 10。 Java 10从Java 10 开始,Java的迭代周期缩短为半年,半年发布一个版本。 局部变量类型推断在Java 6时初始化一个Map需要我们这样来声明: Map<String, String> map = new HashMap<String,String>(); 事实上泛型方法的参数可以通过上下文推导出来,所以在Java 7 中简化为: Map<String, String> map = new HashMap<>(); 到了Java 10 进一步升华了类型推断,我们看一个例子: var ma...

Java 17 是Java 最重要的一个LTS版本之一,但是直接从Java 8 过渡到Java 17跨度太大了,势必有些困难。所以胖哥抽时间梳理了一下从Java 9到Java 17的一些常用API的变动。今天先来看看Java 9 都有什么东西。 Java 9Java 9 最大的变化就是引入了一个JShell和模块化,日常并没有用太多,所以今天不花时间在这些功能上面。 新的创建集合的方法用过谷歌Guava类库的知道,Guava提供了创建集合的静态工厂方法,而且能够推断泛型,举个例子: List<Person> list = Lists.newArrayList();Map<KeyType, Person> map = Maps.newLinkedHashMap(); 而原生态需要各种new来定义。Java 9改善了这一现状,现在你可以: // [1, 2, 3,...

Java 最重要的一次更新:JAVA 17 正式发布,这是一个LTS(长期支持)版本,带来了不少有用的新特性。Java 17 属于长期支持版本 (LTS),将会获得 8 年的技术支持,直至 2029 年 9 月。 Java 17 总共包含 14 个 JEP,具体如下: Restore Always-Strict Floating-Point Semantics 恢复始终执行严格模式 (Always-Strict) 的浮点定义 Enhanced Pseudo-Random Number Generators 添加增强的伪随机数生成器 New macOS Rendering Pipeline 为 macOS 引入新渲染管道 macOS/AArch64 Port 支持将 JDK 移植到 macOS/AArch64 架构 Deprecate the Applet API for Remov...

什么是设计模式 设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 为什么要学习设计模式 看懂源代码:如果你不懂设计模式去看Jdk、Spring、SpringMVC、IO等等等等的源码,你会很迷茫,你会寸步难行 看看前辈的代码:你去个公司难道都是新项目让你接手?很有可能是接盘的,前辈的开发难道不用设计模式? 编写自己的理想中的好代码:我个人反正是这样的,对于我自己开发的项目我会很认真,我对他比对我女朋友还好,把项目当成自己的儿子一样 设计模式分类 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、...

今天到工作室比较晚,在电脑前吃着早饭,看到提示IDEA提示升级,寻思已经有好久没有升过级了。一样等着,就升级下吧。 升级完毕重启之后,突然发现好多错误,原来的应用也没法启动了。仔细一看报错信息,是由于Lombok相关的注解似乎都没有生效。 比如:用到@Slf4j的类里,会有类似这样的报错: java: 找不到符号 符号: 变量 log 位置: 类 com.didispace.UserService IDEA还提示,现在使用的编译器不支持lombok java: You aren't using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy26 Lombok supports...