我在 MacOS 上使用 Java 14 中的 JPackage,需要在构建 DMG 之前将文件复制到应用程序的 MacOS 和资源文件夹,但不知道如何操作。在打包工具用户指南中,它提到从名为 application-name-post-image.sh 的资源文件夹运行脚本,但这似乎没有发生。
我在https://www.baeldung.com/java-pattern-matching-instanceof上遇到了这个惊人的话题。但是当我尝试运行以下代码时,它会引发编译时错误:
if(obj instanceof String s) {
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
错误说:
语言级别“14”不支持“instanceof”中的模式
Error:(36, 34) java: instanceof 中的模式匹配是一个预览功能,默认情况下是禁用的。(使用 --enable-preview 在 instanceof 中启用模式匹配)
但是我安装了 Java 14。
我无法在 IntelliJ 中创建 Java 记录类,并且找不到启用它的选项。
有办法启用它吗?
我在 build.gradle 中有 hibernate 依赖项,但出现以下错误
> Task :JPABootstrapping.main() FAILED
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named recipes
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at setup.JPABootstrapping.main(JPABootstrapping.java:10)
Execution failed for task ':JPABootstrapping.main()'.
> Process 'command '/usr/lib/jvm/java-14-openjdk-amd64/bin/java'' finished with non-zero exit value 1
Run Code Online (Sandbox Code Playgroud)
是persistence.xml在下src/main/resources/META-INF
<persistence>
<persistence-unit name="recipes">
<description>Hibernate Tips</description>
<provider>
org.hibernate.jpa.HibernatePersistenceProvider
</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL81Dialect" />
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://192.168.122.242:5432/recipes" />
<property name="javax.persistence.jdbc.user" value="postgres" />
<property name="javax.persistence.jdbc.password" value="postgres" />
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
IntelliJ的检查功能说 …
我正在研究java中的模式变量。在阅读JLS时,它提到了有关何时引入模式变量的几个条件。它提到——
该分析依赖于技术术语“introduced by”,其形式如下:
- 当 true 时,模式变量由表达式引入
- 当 false 时,模式变量由表达式引入
- 模式变量由语句引入
在 6.3.1 中提到了表达式中模式变量的范围,其中指出何时为&&、||、!、?:等引入模式变量。
但我觉得解释很混乱,谁能详细说明一下&&,,||!
模式变量的示例 -
Object o = "a";
if(o instanceof String s) {
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
我困惑的地方——
class foo {
String s, n, p, m;
void method() {
Object o = "s";
if (!(o instanceof Integer s) && o instanceof Integer n) {
System.out.println(s + " " …Run Code Online (Sandbox Code Playgroud) 这是 Java 库中的一个片段:
public final boolean compareAndExchangeAcquire(boolean expectedValue, boolean newValue) {
return (int)VALUE.compareAndExchangeAcquire(this,
(expectedValue ? 1 : 0),
(newValue ? 1 : 0)) != 0;
}
Run Code Online (Sandbox Code Playgroud)
它来自AtomicBoolean课堂。演员怎么能int返回一个boolean?
我的主要问题:compareAndExchangevs之间有什么区别compareAndExchangeAcquire?
通俗地说:在申请之前xxxAcquire和之后写的语句xxxRelease可以自由重新排序xxx。
我本质上是在问与这个老问题相同的问题,但针对的是 Java 14 而不是 Java 8。为了避免回答者导航到老问题的麻烦,我将在这里重新表述。我想从引用的方法中获取函数的名称。下面的 Java 代码应该能让您明白:
public class Main
{
public static void main(String[] args)
{
printMethodName(Main::main);
}
private static void printMethodName(Consumer<String[]> theFunc)
{
String funcName = // somehow get name from theFunc
System.out.println(funcName)
}
}
Run Code Online (Sandbox Code Playgroud)
C# 中的等效内容是:
public class Main
{
public static void Main()
{
var method = Main.Main;
PrintMethodName(method)
}
private static void PrintMethodName(Action action)
{
Console.WriteLine(action.GetMethodInfo().Name);
}
}
Run Code Online (Sandbox Code Playgroud)
根据老问题的公认答案,如果没有大量的工作,这在 Java 8 中是不可能的,例如这个解决方案。Java 14中有更优雅的解决方案吗?
我必须处理一个关于在我的 mac 上安装 Java 的令人困惑的问题:
但是如果我java -version在终端中输入,我会得到
java version "14" 2020-03-17
Java(TM) SE Runtime Environment (build 14+36-1461)
Java HotSpot(TM) 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)
所以,似乎仍然安装了Java。
我的系统:macOS High Sierra 版本 10.13.6
通过对 Java 14 中 Records 的介绍的简短搜索,我看到 Record 字段被编译为最终实例变量。这似乎意味着我不能写入 Record 字段......也没有任何教程提到关于写入 Record 字段的任何内容。
这是为什么?为什么我不能像在 C 中使用结构一样在 Java 14 中使用 Record ?
感谢您的任何见解
我认为 Java 14 中新的 Java Record 数据类型应该适用于跨网络的数据,因为数据不应该在过程中发生变化,这是记录数据类型的主要特征 - 不可变。
我使用 RSocket 中的数据类型。在发送方,编码器出现错误。我还没有找到编码器是关于什么的。在接收器端,出现解串器错误。据我所知,记录不能实现诸如 Serializable 之类的接口。
所以,记录数据类型不适用于网络编程,对吗?
更新:
我将 Serializable 接口添加到发送方和接收方的记录定义中。发出请求后,TCP发送端没问题,但接收端报错
No encoder for com.....data.Notification, current value type is class com.....data.Notification
Run Code Online (Sandbox Code Playgroud)
那些标记这个问题的人有不同的经历吗?
java ×10
java-14 ×10
java-record ×3
concurrency ×1
deployment ×1
gradle ×1
hibernate ×1
jls ×1
jpackage ×1
lambda ×1
macos ×1
packing ×1
reflection ×1