• 「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」
  • 当然 不论新老朋友 我相信您都可以 从中获益。如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力!

Java 11 为什么重要?

Java 11 是继 Java 8 之后的第二个 LTS(long-term support)版本。自 Java 11 起,Oracle JDK 将不再免费提供商业用途

您可以在开发阶段使用它,但要在商业上使用它,则需要购买许可证。

Java 10 是最后一个可以下载的免费 Oracle JDK。

Oracle 从 2019 年 1 月开始就停止了对 Java 8 的支持。您需要支付更多的支持费用。

如果不这样做,虽然您可以继续使用它,但不会获得任何补丁/ 安全更新。

自 Java 11 起,Oracle 将不再为任何单个 Java 版本提供免费的长期支持(LTS)。

尽管 Oracle JDK 不再免费,但是您始终可以从 Oracle 或其他提供商(例如 AdoptOpenJDK,Azul,IBM,Red Hat 等..)下载 Open JDK 构建。

什么是 LTS Module

从 2017 年开始,Oracle 和 Java 社区宣布了向 Java 的新 6 个月节奏的转变。它已迁移到 Oracle Java SE 产品的长期支持(LTS)模型。

LTS 版本的产品将提供 Oracle 的首要和持续的支持,目标是每三年一次。

每个 Java 版本都以一两个主要特性为模型,这些特性驱动了版本的发布。任何障碍都会推迟发布和上市时间。Jigsaw 项目就是 Java 9 的一个主要特性,它多次推迟了发布日期,并且发布时间被推迟了超过 1.5 年。6 个月一版的发车节奏将让特性紧随。发布的列车每 6 个月有一个时间表。赶上这列火车的特征会被留下,否则他们就等下一班火车。

Oracle JDK 与 Open JDK

为了对开发人员更加友好,Oracle & Java 社区现在将 OpenJDK 二进制文件作为主要 JDK 进行推广。

这与早期的 JDK 二进制文件是由 Oracle 专有并由 Oracle 许可的模式相比,很大程度上减轻了人们的负担,因为 Oracle 对重新发布有各种限制。

然而,Oracle 将继续生产他们的 JDK,但仅限于长期支持版本。这是朝着对云和容器更友好的方向迈出的一步,因为开放 JDK 二进制文件可以作为容器的一部分分发。

Open JDK 的二进制文件每 6 个月发布一次,而 Oracle JDK 的二进制文件每 3 年发布一次(LTS版本)。

特性总览

在了解完了 Java 11 附带的负担之后,现在让我们作为开发人员分析 Java 11 中的重要功能。

以下是 Java 11 中的引入的部分新特性。关于 Java 11 新特性更详细的介绍可参考这里

  • 基于嵌套的访问控制(JEP 181)
  • 使用单个命令运行Java文件(JEP 330)
  • Lambda 参数的局部变量语法(JEP 323)
  • 动态类文件常量(JEP 309)
  • HTTP 客户端(JEP 321)
  • Epsilon-无操作垃圾收集器(JEP 318)
  • 可扩展的低延迟垃圾收集器-ZGC(JEP 333)
  • Unicode 10(JEP 327)
  • 低开销堆分析(JEP 331)
  • API 变更
  • 其他变更
    • 删除 Java EE 和 CORBA 模块(JEP 320)
    • 飞行记录器(JEP 328)
    • ChaCha20 和 Poly1305 加密算法(JEP 329)
    • 改进 Aarch64 内部特征(JEP 315)
    • 弃用 Nashorn JavaScript 引擎(JEP 335)
    • 传输层安全性(TLS)1.3(JEP 332)
    • 弃用 Pack200 工具和 API(JEP 336)

一. 基于嵌套的访问控制(JEP 181)

在 Java 11 之前,从嵌套类访问主类的 private 方法是可能的:

public class Main {

    public void myPublic() {
} private void myPrivate() {
} class Nested { public void nestedPublic() {
myPrivate();
}
}
}

但是,如果我们使用反射,它就会给出一个 IllegalStateException

jshell> Main ob = new Main();
ob ==> Main@533ddba jshell> import java.lang.reflect.Method; jshell> Method method = ob.getClass().getDeclaredMethod("myPrivate");
method ==> private void Main.myPrivate() jshell> method.invoke(ob);
| 异常错误 java.lang.IllegalAccessException:class REPL.$JShell$15 cannot access a member of class REPL.$JShell$11$Main with modifiers "private"
| at Reflection.newIllegalAccessException (Reflection.java:376)
| at AccessibleObject.checkAccess (AccessibleObject.java:647)
| at Method.invoke (Method.java:556)
| at (#5:1) jshell>

这是因为 JVM 访问规则不允许嵌套类之间进行私有访问。我们能通过第一种方式访问是因为 JVM 在编译时为我们隐式地创建了私有的 桥接方法

而且这发生在幕后。这种桥接方法会稍微增加已部署应用程序的大小,并可能使用户和工具感到困惑。

Java 11 引入嵌套访问控制解决了这一问题。

Java 11 将嵌套的概念和相关的访问规则引入了JVM。这简化了 Java 源代码编译器的工作。

为此,类文件格式现在包含两个新属性:

  1. 一个嵌套成员(通常是顶级类)被指定为嵌套主类。它包含一个属性(NestMembers)来标识其他静态已知的嵌套成员。
  2. 其他每个嵌套成员都有一个属性(NestHost)来标识其嵌套主类。

因此,要使类型 C 和 D 成为嵌套伙伴,它们必须具有相同的嵌套主类。如果类型 C 在其 NestHost 属性中列出 D,则它声称是 D 托管的嵌套的成员。如果 D 还在其 NestMembers 属性中列出 C ,则将验证成员资格。另外,类型 D 隐式为其所托管的嵌套成员。

现在,编译器无需生成桥接方法

java.lang.Class 在反射 API 中介绍了三种方法:getNestHost()getNestMembers(),和isNestmateOf(),用于支持上述的工作。

更多请阅读:https://www.baeldung.com/java-nest-based-access-control

二. 使用单个命令运行Java文件(JEP 330)

该 JEP 是在学习 Java 早期阶段的一个友好功能,但是在实际的 Java 开发中没有太大的用处,我们都使用 IDE。

假设我们现在有以下的源代码(.java 文件):

public class HelloJava {

    public static void main(String[] args) {
System.out.println("Hello World!");
}
}

在 Java 11 编译运行需要:

$ javac HelloJava.java

$ java HelloJava

Hello World!

在 Java 11 中:

$ java HelloJava.java

Hello World!

另外,我们也可以使用 Linux Shebang 运行单个的 Java 程序:

#!/opt/java/openjdk/bin/java --source 11
public class SheBang { public static void main(String[] args) { System.out.println("Hello World!"); }
}

这里是在 Docker 中如此使用 Linux Shebang 运行 Java 的例子:https://mkyong.com/java/java-11-shebang-example-in-docker/

三. Lambda 参数的局部变量语法(JEP 323)

该 JEP 是 Java 11 中唯一的语言功能的加强。

我们知道,在 Java 10 中,引入了局部变量类型推断。因此,我们可以从 RHS 推断出变量的类型:var list = new ArrayList<String>();

JEP 323 允许 var 用于声明隐式类型的 Lambda 表达式的形式参数:

List<String> list = Arrays.asList("关注", "我没有三颗心脏", "更多精彩内容分享");
String result = list.stream()
.map((var x) -> x.toUpperCase())
.collect(Collectors.joining(","));
System.out.println(result2);

上面与下面这个等效:

List<String> list = Arrays.asList("关注", "我没有三颗心脏", "更多精彩内容分享");
String result = list.stream()
.map(x -> x.toUpperCase())
.collect(Collectors.joining(","));

这(省略类型声明的形式)在 Java 8 中也是允许的,但是在 Java 10 中删除了。现在,它又回到 Java 11 中以保持一致。

为什么支持 var 来声明隐式的 Lambda 参数呢?(特别是当我们只需跳过 Lambda 类型时)

答案是如果您想要像 @NotNull 一样 注释参数 时,则不能在不定义类型的情况下这样做:

import org.jetbrains.annotations.NotNull;

List<String> list = Arrays.asList("关注", "我没有三颗心脏", "更多精彩内容分享", null);
String result = list.stream()
.map((@NotNull var x) -> x.toUpperCase())
.collect(Collectors.joining(","));
System.out.println(result3);

此功能也有一定的 局限性——您必须在所有参数上指定 var 类型,或者不指定任何类型。

在用于 Lambda 内部的参数声明中,不可能出现以下这几种情况:

(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.

四. 动态类文件常量(JEP 309)

为了使 JVM 对动态语言更具吸引力,Java SE 7 已将 invokedynamic 引入了其指令集。Java 开发人员通常不会注意到此功能,因为它隐藏在 Java 字节码中。

简而言之,通过使用 invokedynamic,可以将方法调用的绑定延迟到第一次调用之前。

例如,Java 语言使用此技术来实现 Lambda 表达式,这些表达式仅在首次使用时才需要出现。

如此,invokedynamic 已发展成为一种基本的语言功能。在 constantdynamic 中,Java 11 引入了一种类似的机制,只是它延迟的是常数值的创建。

但 Java 11 本身缺少对 constantdynamic 的支持,所以这里不做详细赘述。

这篇文章详细讨论了该特性的目的和内部工作原理,并展示了如何使用 Byte Buddy 库生成使用此新指令的代码,感兴趣的可以阅读一下:https://mydailyjava.blogspot.com/2018/08/hands-on-constantdynamic-class-file.html

五. HTTP 客户端(JEP 321)

Java 11 标准化了 Http CLient API。

新的 API 支持 HTTP / 1.1 和 HTTP / 2。它旨在提高客户端发送请求和从服务器接收响应的整体性能。它还原生支持 WebSockets。

下面是一个使用 Java 11 HttpClient 发送一个简单 GET 请求的例子:

HttpClient httpClient = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.connectTimeout(Duration.ofSeconds(10))
.build(); HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create("https://www.wmyskxz.com"))
.setHeader("User-Agent", "Java 11 HttpClient Bot")
.build(); HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); HttpHeaders headers = response.headers();
headers.map().forEach((k, v) -> System.out.println(k + ":" + v)); System.out.println(response.statusCode());
System.out.println(response.body());

关于 HttpClient 更多内容请阅读:https://mkyong.com/java/java-11-httpclient-examples/

六. Epsilon-无操作垃圾收集器(JEP 318)

与负责分配内存并释放内存的 JVM GC 不同,Epsilon 仅分配内存。

它为以下内容分配内存:

  • 性能测试。
  • 内存压力测试。
  • VM 接口测试。
  • 寿命极短的工作。
  • 最后一滴延迟改进。(Last-drop latency improvements.)
  • 最终吞吐量提高。

现在,Elipson 仅适用于测试环境。这将导致生产中的 OutOfMemoryError 并使应用程序崩溃。

Elipson 的好处是没有内存清除开销。因此,它将给出准确的性能测试结果,我们不再可以通过 GC 来停止它。

注意:这是一项实验性功能。

七. 可扩展的低延迟垃圾收集器-ZGC(JEP 333)

Z垃圾收集器(ZGC)是可伸缩的低延迟垃圾收集器。ZGC 可以同时执行所有昂贵的工作,而不会将应用程序线程的执行停止超过 10 毫秒,这使得它们适合于要求低延迟和/或使用非常大的堆(数TB)的应用程序。

Z 垃圾收集器可作为实验功能使用,可以通过命令行选项启用 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC

(ps:该垃圾收集器在 JDK 15 才生产准备就绪——JEP 377——所以可以不怎么关注它,因为我们大概率很长一段时间都不会用上)

OpenJDK-wiki:https://wiki.openjdk.java.net/display/zgc/Main

八. Unicode 10(JEP 327)

以下是 Unicode 10.0 发行版中可用的新表情符号:

关于 Unicode 10.0 的更新,你可以在 这里 看到详细的内容,概括起来就是:

“ Unicode 10.0增加了8,518个字符,总共136,690个字符。这些增加包括4个新脚本,总共139个脚本,以及56个新表情符号字符。”

代码演示:

public class PrintUnicode {

    public static void main(String[] args) {
String codepoint = "U+1F92A"; // crazy face
System.out.println(convertCodePoints(codepoint));
} // Java, UTF-16
// Convert code point to unicode
static char[] convertCodePoints(String codePoint) {
Integer i = Integer.valueOf(codePoint.substring(2), 16);
char[] chars = Character.toChars(i);
return chars; }
}

好文推荐:

在 Java 中使用 Unicode 的乐趣:https://www.codetab.org/post/java-unicode-basics/

该文章详细介绍了编码和解码以及 Unicode 的基础知识,并通过 Java 编程详细的展示了 Unicode 在 Java 中的使用例子。

九. 低开销堆分析(JEP 331)

Java 虚拟机工具接口(JVM TI)是在 Java SE 5 引入的,它可以监控 JVM 内部事件的执行,也可以控制 JVM 的某些行为,可以实现调试、监控、线程分析、覆盖率分析工具等。

该 JEP 在 JVM TI 中添加了新的低开销的堆分析 API。

进一步阅读:Oracle 官方 JVM TI 文档 - https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html

十. API 变更

字符串新增方法

isBlank()

isBlank() ——此实例方法返回一个布尔值。空字符串和仅包含空格的字符串将被视为空。

import java.util.*;

public class Main {
public static void main(String[] args) throws Exception {
System.out.println(" ".isBlank()); //true String s = "wmyskxz";
System.out.println(s.isBlank()); //false
String s1 = "";
System.out.println(s1.isBlank()); //true
}
}

lines()

此方法返回字符串流,它是按行分割的所有子字符串的集合。

jshell> import java.util.stream.Collectors;

jshell> String str = "JD\nJD\nJD";
str ==> "JD\nJD\nJD" jshell> System.out.println(str);
JD
JD
JD jshell> System.out.println(str.lines().collect(Collectors.toList()));
[JD, JD, JD] jshell>

strip() / stripLeading() / stripTrailing()

strip()——删除字符串开头和结尾的空格。

stripLeading()——删除字符串开头的空格。

stripTrailing()——删除字符串结尾的空格。

jshell> String str = " 我没有三颗心脏 ";
str ==> " 我没有三颗心脏 " jshell> System.out.print("关注" + str.strip() + "更多精彩内容");
关注我没有三颗心脏更多精彩内容
jshell> System.out.print("关注" + str.stripLeading() + "更多精彩内容");
关注我没有三颗心脏 更多精彩内容
jshell> System.out.print("关注" + str.stripTrailing() + "更多精彩内容");
关注 我没有三颗心脏更多精彩内容
jshell>

repeat(int)

repeat 方法简单地以 int 形式将字符串重复多次。

jshell> String str = "关注【我没有三颗心脏】获取更多精彩内容!".repeat(3);
str ==> "关注【我没有三颗心脏】获取更多精彩内容!关注【我没有三颗心脏】获取更多精彩内容!关注【我没有三颗心脏】获取更多精彩内容!" jshell>

文件读写字符串

Java 11 致力于 String 的读写变得方便。它引入了以下用于读写文件的方法:

  • readString();
  • writeString();

以下是代码示例:

Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on wmyskxz.com");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on wmyskxz.com

十一. 其他变更

删除 Java EE 和 CORBA 模块(JEP 320)

Java 9 中已经弃用了这些模块,现在将它们完全删除。

下面的包被删除:java.xml.wsjava.xml.bindjava.activationjava.xml.ws.annotationjava.corbajava.transactionjava.se.eejdk.xml.wsjdk.xml.bind

飞行记录器(JEP 328)

Flight Recorder 以前是 Oracle JDK 中的商业附加组件,现已开放源代码,因为 Oracle JDK 本身已不再免费。

JFR 是一种分析工具,用于从正在运行的 Java 应用程序中收集诊断信息和分析数据。它的性能开销可以忽略不计,通常低于 1%。因此,它可以用于生产应用。

默认情况下,JVM 禁用了 JFR,要启动 JFR,必须使用 -XX:+FlightRecorder 选项启动。例如,我们要启动名为 MyApp 的应用程序:

java -XX:+ UnlockCommercialFeatures -XX:+ FlightRecorder MyApp

Java Fliight Recorder 小试牛刀 - https://juejin.im/post/6844903684912988167

ChaCha20 和 Poly1305 加密算法(JEP 329)

Java 11 提供了 ChaCha20 和 ChaCha20-Poly1305 密码实现。这些算法将在 SunJCE 提供程序中实现。

有详细了解需求的朋友可以参看:https://mkyong.com/java/java-11-chacha20-poly1305-encryption-examples/

改进 Aarch64 内部特征(JEP 315)

改进现有的字符串和数组内在函数,并在 AArch64 处理器上为 java.lang.Math 包下的 sincoslog 函数实现新的内在函数。

弃用 Nashorn JavaScript 引擎(JEP 335)

Nashorn JavaScript脚本引擎和jjs工具已被弃用,将来的发行版中可能会删除它。

(ps:Nashorn 是在 Java 8 JEP 174 中引入,以代替 Rhino Javascript 引擎。)

传输层安全性(TLS)1.3(JEP 332)

Java 11 支持 RFC 8446 传输层安全性(TLS)1.3协议。但是,并非所有TLS 1.3功能都已实现,有关详细信息,请参考此 JEP 332

Java 安全套接字扩展(JSSE)+ TLS 1.3 示例。

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory; SSLSocketFactory factory =
(SSLSocketFactory) SSLSocketFactory.getDefault();
socket =
(SSLSocket) factory.createSocket("google.com", 443); socket.setEnabledProtocols(new String[]{"TLSv1.3"});
socket.setEnabledCipherSuites(new String[]{"TLS_AES_128_GCM_SHA256"});

弃用 Pack200 工具和 API(JEP 336)

该 JEP 不推荐 pack200unpack200 工具以及软件包中的 Pack200 API java.util.jar,并且可能会在将来的版本中删除。

(ps:Java 14 JEP 367 中删除了 Pack200 工具和 API 。)

参考资料

  1. OpenJDK 官方说明 - http://openjdk.java.net/projects/jdk/10/
  2. Java 11 Features - https://www.journaldev.com/24601/java-11-features
  3. What is new in Java 11 - https://mkyong.com/java/what-is-new-in-java-11/
  4. Java 11 Nest Based Access Control | Baeldung - https://www.baeldung.com/java-nest-based-access-control

文章推荐

  1. 这都JDK15了,JDK7还不了解? - https://www.wmyskxz.com/2020/08/18/java7-ban-ben-te-xing-xiang-jie/
  2. 全网最通透的 Java 8 版本特性讲解 - https://www.wmyskxz.com/2020/08/19/java8-ban-ben-te-xing-xiang-jie/
  3. Java9的这些史诗级更新你都不知道? - https://www.wmyskxz.com/2020/08/20/java9-ban-ben-te-xing-xiang-jie/
  4. 你想了解的 JDK 10 版本更新都在这里 - https://www.wmyskxz.com/2020/08/21/java10-ban-ben-te-xing-xiang-jie/
  5. 「MoreThanJava」系列文集 - https://www.wmyskxz.com/categories/MoreThanJava/
  • 本文已收录至我的 Github 程序员成长系列 【More Than Java】,学习,不止 Code,欢迎 star:https://github.com/wmyskxz/MoreThanJava
  • 个人公众号 :wmyskxz,个人独立域名博客:wmyskxz.com,坚持原创输出,下方扫码关注,2020,与您共同成长!

非常感谢各位人才能 看到这里,如果觉得本篇文章写得不错,觉得 「我没有三颗心脏」有点东西 的话,求点赞,求关注,求分享,求留言!

创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

这里有你不得不了解的Java 11版本特性说明的更多相关文章

  1. Java 11 新特性介绍

    Java 11 已于 2018 年 9 月 25 日正式发布,之前在Java 10 新特性介绍中介绍过,为了加快的版本迭代.跟进社区反馈,Java 的版本发布周期调整为每六个月一次——即每半年发布一个 ...

  2. 【整理】Java 11新特性总结

    闲语 2018年9月25日,Java 11正式发布,与JDK 10不同,JDK 11将提供长期支持,还将作为Java平台的参考实现以及标准版(Java SE)11.Oracle直到2023年9月都会为 ...

  3. 【JAVA各版本特性】JAVA 1.0 - JAVA 12

    make JDK Version 1.01996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢. JDK Version 1.119 ...

  4. 最通俗易懂的 Java 11 新特性讲解

    大多数开发者还是沉浸在 Java 8 中,而 Java 14 将要在 2020 年 3 月 17 日发布了,而我还在写着 Java 11 的新特性.Java 11 是 Java 8 之后的第一个 LT ...

  5. 转 : Java的版本特性与历史

    Java Versions, Features and History This article gives you a highlight of important features added i ...

  6. Java14版本特性【一文了解】

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  7. Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

    美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本. 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Java 8 扩 ...

  8. Java 11 这 8 个逆天新特性教你写出更牛逼的代码!

    美国时间2018年 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本. 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Jav ...

  9. Java 8后的首个长期支持版本Java 11

    Java 11是Java8后的首个长期支持版本.按照 Oracle 公布的支持路线图,Java 11 将会获得 Oracle 提供的长期支持服务,直至2026年9月. 按照官方的说法,新的发布周期会严 ...

  10. Java 11正式发布,这几个逆天新特性教你写出更牛逼的代码

    就在前段时间,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布,可在生产环境中使用! 这无疑对我们来说是一大好的消息.作为一名java开发者来说,虽然又要去学习和了解java11 ...

随机推荐

  1. push竟比concat快上数百倍?记一个concat在十万级数据引发的性能问题

    壹 ❀ 引 公司产品一直在做企业项目研发工具,所以我们自己当然也会用自己的产品去管理公司大小项目,但在此之前,项目管理体验上一直存在一个卡顿问题.比如我刚登录上账号,在项目里随便到处点点到处跳转页面, ...

  2. Swoole从入门到入土(2)——TCP服务器[初步接触]

    我们知道Swoole弥补了PHP没办法实现长连接的短板,在接下来的话题中,我们会从TCP服务器.HTTP服务器.WebSocket服务器.协程.管道.中间件等话题,一个个进行讨论. 1.开篇 我们以S ...

  3. centos 安装nacos 并以后台服务形式启动

    一.下载解压nacos tar -xvf nacos-server-1.2.0.tar.gz 二.持久化配置(mysql) 修改nacos/conf/application.properties文件, ...

  4. Spring和Spring Boot的区别

    spring Spring 是一个开源轻量级框架,它允许 Java EE 7 开发人员构建简单.可靠和可扩展的企业应用程序.该框架主要侧重于提供各种方法来帮助您管理业务对象.与 Java 数据库连接 ...

  5. 禁用Windows自动更新并允许手动更新

    新版的 Windows 经常会自动检查更新,然后在某个夜深人静的晚上帮你自动更新. 对于自动更新,一般的解决方案是直接禁用 Windows 更新服务.这种方式虽然关闭了自动更新,但会影响手动更新.Wi ...

  6. python实用模块之netifaces获取网络接口地址相关信息

    文档 https://pypi.org/project/netifaces/ 安装 pip install netifaces 使用 import netifaces netifaces.interf ...

  7. 问题:django中对datetime类型数据在pycharm中sqlite3进行修改时,修改后datetime日期数据变成了时间戳类型

    这是正在修改的 提交完之后 问题原因 问题原因是sqlite数据库对日期类型不敏感,Pycharm直接插入会变成图中这样的时间戳,用POST请求添加数据或Django自带的后台管理插入不会有这样的问题 ...

  8. React同级组件传值

         在React中同级组件本身是没有任何关联的,要想有联系只能通过共同的父组件传值,一个子组件将数据传递到父组件中,父组件接收值再传入另一个子组件中 <!DOCTYPE html> ...

  9. 我的第一个项目(八):(解决问题)图片资源无法加载(Error: Cannot find module "../../xxx" )

    好家伙,问题一堆   先开一个测试页模拟游戏模块的运行 原先的图片初始化方法失效了,(vue里面自然是用不了这种方法的) function createImage(src) { let img; if ...

  10. nftables语法及例子

    先上我自己实际测试通过的例子,用例子便于在实践中学习: # 0 --- 说明 ---下面例子中的单引号目的是为了避免nftable参数中的星号.花括号.分号等符号被shell展开解释掉了,导致nft命 ...