标签: java-17

无法使字段最终瞬态 java.lang.Class java.util.EnumSet.elementType 可访问:模块 java.base 不会向未命名的对象“打开 java.util”

当我使用 JDK 17 运行此测试时出现此错误:

java.lang.reflect.InaccessibleObjectException: Unable to make field final transient java.lang.Class java.util.EnumSet.elementType accessible: module java.base does not "opens java.util" to unnamed module @60addb54
Run Code Online (Sandbox Code Playgroud)
    @Test
    public void testThatDeepCopyCopiesEmptySet() {
        SetOfEnumUserType setOfEnumUserType = createSetOfEnumUserType();
        EnumSet<PaymentMethodType> src = EnumSet.noneOf(PaymentMethodType.class);
        EnumSet<?> dest = (EnumSet<?>) setOfEnumUserType.deepCopy(src);
        assertThat(dest, (is(src)));
        assertThat(dest, not(isSameInstanceAs(src)));
        Class<?> srcType = (Class<?>) ReflectionTestUtils.getField(src, "elementType");
        Class<?> destType = (Class<?>) ReflectionTestUtils.getField(dest, "elementType");
        assertThat(srcType, (is(destType)));
    }
Run Code Online (Sandbox Code Playgroud)

我尝试根据其他答案将其添加到我的 pom.xml 中:

           <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <compilerArgs>
                        <arg>--add-opens java.base/java.lang=ALL-UNNAMED</arg>
                        <arg>--add-opens java.base/java.util=ALL-UNNAMED</arg>
                    </compilerArgs>
                </configuration>
            </plugin> …
Run Code Online (Sandbox Code Playgroud)

java maven java-platform-module-system java-17

8
推荐指数
1
解决办法
4万
查看次数

Mockito 无法在 Java 17 中模拟 Random

尝试将我的项目从 Java 11 更新到 Java 17,并在特定测试中从 Mockito 收到意外错误。

mock(java.util.Random.class);
Run Code Online (Sandbox Code Playgroud)

投掷

Feb 04, 2022 3:07:01 PM com.google.inject.internal.MessageProcessor visit
INFO: An exception was caught and reported. Message: java.lang.IllegalAccessException: class 
    net.bytebuddy.description.annotation.AnnotationDescription$ForLoadedAnnotation cannot access interface
    jdk.internal.util.random.RandomSupport$RandomGeneratorProperties (in module java.base) 
    because module java.base does not export jdk.internal.util.random to unnamed module @2f54a33d
org.mockito.exceptions.base.MockitoException: 
Mockito cannot mock this class: class java.util.Random.

Mockito can only mock non-private & non-final classes.
If you're not sure why you're getting this error, please report to the mailing list.


Java               : 17 …
Run Code Online (Sandbox Code Playgroud)

java mockito java-17

8
推荐指数
2
解决办法
2万
查看次数

了解 Java 17 Vector 使用 pow 运算符的缓慢性和性能

我有一个与 Java 17 新的 Vector API 功能中的 pow() 函数相关的问题。我正在尝试以矢量化方式实现布莱克斯科尔斯公式,但我很难获得与标量实现相同的性能

\n

代码如下:

\n
    \n
  1. 我创建了一个双精度数组(目前只有 5.0)
  2. \n
  3. 我循环该数组的元素(标量和向量的循环语法不同)
  4. \n
  5. 我从其中的双数组创建 DoubleVectors 并进行计算(或只是计算标量)我正在尝试执行 e^(value),我相信这就是问题所在
  6. \n
\n

以下是一些代码片段:

\n
    public static double[] createArray(int arrayLength)\n    {\n        double[] array0 = new double[arrayLength];\n        for(int i=0;i<arrayLength;i++)\n        {\n            array0[i] = 2.0;\n        }\n        return array0;\n    } \n
Run Code Online (Sandbox Code Playgroud)\n
    @Param({"256000"})\n    int arraySize;\n    public static final VectorSpecies<Double> SPECIES = DoubleVector.SPECIES_PREFERRED;\n    DoubleVector vectorTwo =  DoubleVector.broadcast(SPECIES,2);\n    DoubleVector vectorHundred =  DoubleVector.broadcast(SPECIES,100);\n\n    double[] scalarTwo = new double[]{2,2,2,2};\n    double[] scalarHundred  = new double[]{100,100,100,100};\n\n    @Setup\n    public void …
Run Code Online (Sandbox Code Playgroud)

java performance simd vectorization java-17

8
推荐指数
1
解决办法
419
查看次数

如何使用 JDK17 在 Java 中生成自签名证书

TL,博士;是否有本地 Java17 解决方案来生成自签名证书,无论是通过标准库(不太可能)还是通过一些轻量级库?

还有一个类似的问题(我问过Access `sun.security.x509` in JDK 11 without module?),因为从 JDK11 开始,对内部 JDK 包的访问受到限制,因此无法使用sun.security.x509. 直到 JDK17 为止,都可以通过某些编译器配置来标记打开这些包来规避它。JDK17 改变了这一点,删除了该选项。

从我能够收集到的当前解决方案是:

  1. BouncyCastle - 但它是一个巨大的 5MB 瑞士刀安全库,因此仅使用它来生成证书似乎有些浪费。
  2. 直接调用keytooljava工具,但这有两个缺点:调用外部工具速度较慢,并且需要创建密钥库文件。

目前(2)在我的用例中似乎更方便,但我很想找到第三个选项 - 本机、轻量级解决方案。

编辑:有 OpenJDK 问题:JDK-8058778:用于创建证书和证书请求的新 API,我希望有一天它会被实现......

java certificate x509certificate java-17 openjdk-17

7
推荐指数
1
解决办法
2777
查看次数

如何将 Java 17 记录转换为 Clojure 映射?

有一个clojure.core/bean将 POJO 转换为 Map 的标准函数:

class MyPojo{
  public String getFirst(){ return "abc"; }
  public int getSecond(){ return 15; }
}

IFn bean = Clojure.var("clojure.core", "bean")

var result = bean.invoke(new MyPojo())

// result => {:first = abc, :second = 15}
Run Code Online (Sandbox Code Playgroud)

对于 Java 17 记录类,此函数不起作用,因为记录不遵循 POJO"get***"属性约定。

Clojure 是否以同样的方式支持 Java 17 记录实例?

clojure java-record java-17

7
推荐指数
1
解决办法
585
查看次数

可选&lt;T&gt;作为Java中的记录参数

Java 8 中引入的类型Optional<T>主要推荐用于返回类型和结果。因此,每当我在类字段或方法参数中使用它时,我都会在 IntelliJ 中收到警告:

Optional<?>用作字段/参数的类型。

Optional<T>但是,当我在规范构造函数中使用 an 作为记录参数时,我没有收到此警告:

public record AuthenticationResult(
    boolean isAuthenticated,
    Optional<User> user,
    Optional<String> authorizationHeader)
{ } 
Run Code Online (Sandbox Code Playgroud)

不使用类型作为参数/字段的做法是否Optional<T>不适用于记录参数,因为字段将始终作为记录自动生成的 getter 方法的返回值进行访问?

或者是因为记录是一项新功能,并且此警告尚未实现,并且在记录中使用可选参数与用作方法参数或字段时具有相同的后果?

java record option-type java-17

7
推荐指数
1
解决办法
4676
查看次数

Spring Boot 无法在 JDK 17 上启动:模块 java.base 不会向未命名模块“打开 java.lang”

我正在将 Spring Boot 应用程序从 JDK 8 迁移到 JDK 17。

但在 JDK 17 中出现以下错误:

java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.findLoadedClass(java.lang.String) accessible: module java.base does not "opens java.lang" to unnamed module @1356d4d4
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[na:na]
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[na:na]
    at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) ~[na:na]
    at java.base/java.lang.reflect.Method.setAccessible(Method.java:193) ~[na:na]
    at org.springframework.util.ReflectionUtils.makeAccessible(ReflectionUtils.java:577) ~[spring-core-5.3.20.jar:5.3.20]
    at org.springframework.context.support.ContextTypeMatchClassLoader$ContextOverridingClassLoader.isEligibleForOverriding(ContextTypeMatchClassLoader.java:99) ~[spring-context-5.3.20.jar:5.3.20]
    at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:87) ~[spring-core-5.3.20.jar:5.3.20]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
    at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:82) ~[spring-core-5.3.20.jar:5.3.20]
    at org.springframework.context.support.ContextTypeMatchClassLoader.loadClass(ContextTypeMatchClassLoader.java:70) ~[spring-context-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1594) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1534) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:704) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:674) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1670) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:570) ~[spring-beans-5.3.20.jar:5.3.20] …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot java-17

7
推荐指数
1
解决办法
2万
查看次数

文本块内的 Java 正则表达式

我当然希望这能得到支持:

\n
private static void regex() {\n    String plain = "\\\\w+";\n    String withTextBlocks = """\n        \\w+\n    """;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

withTextBlocks不能在 Java-17 下编译。\xe2\x80\x99 是不是我们不应该转义的文本块点?我已经通过了JEP,也许解释就在那里,但我无法理解它。第二个问题,如果有人知道的话,未来是否有一个 JEP?谢谢。

\n

java regex escaping java-17

7
推荐指数
1
解决办法
564
查看次数

R8 与 Android Studio Flamingo 中密封类的兼容性

当我想发布我的应用程序时出现此错误:com.android.tools.r8.internal.jb: Sealed classes are not supported as program classes when generating class files

  • Android Studio:Flamingo 2022.2.1(我也尝试2022.3.1 Giraffe)
  • Gradle版本:8.0(我也尝试8.1和8.0.2)
  • Gradle 插件版本:8.0.0
  • JDK:17.0.6(嵌入式 Android Studio Flamingo)

在 build.gradle 中,由于 android studio min gradle,我无法编辑编译版本。

compileOptions {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
  }
  kotlinOptions {
    jvmTarget = "17"
  }
Run Code Online (Sandbox Code Playgroud)

我在模块中使用的密封类是

compileOptions {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
  }
  kotlinOptions {
    jvmTarget = "17"
  }
Run Code Online (Sandbox Code Playgroud)

android kotlin sealed-class android-r8 java-17

7
推荐指数
1
解决办法
3447
查看次数

Java 8 到 Java 17 的迁移导致 Docker 容器内存显着增加

您能否帮助我们解答有关 ECS 中 Docker 容器中运行的 Java 8 Spring boot 应用程序的疑问?迁移到 Java 17 后,我们观察到与在 Java 8 上运行的容器的内存使用量相比,容器的内存使用量显着增加了 1GB(我们使用docker stats两个容器的命令比较了内存​​)。我们只有 Java 进程在容器内运行。jmap下面提供了 Java 8 和 Java 17 的命令输出。我们观察到的唯一重大变化是:

  1. 垃圾收集算法是 G1,与 Java 8 中的 CMS 相比,它现在是 Java 17 中的默认算法。
  2. 从 Java 8 中的 166.375MB增加到MaxNewSizeJava 17 中的 1228.0MB。

我们想知道这是否是 Docker 容器中内存使用量增加的原因。我们了解到,新的 G1 垃圾收集算法的内存使用量略高(从命令输出中发现,大约 120 MB,而 CMS 的内存使用量为 12 MB jcmd VM.native_memory),但我们没想到会出现如此剧烈的增加。关于这个问题的任何建议或见解将不胜感激。

Java 8 的 jmap 输出

using parallel threads in the new generation.
using thread-local object allocation. …
Run Code Online (Sandbox Code Playgroud)

garbage-collection heap-memory g1gc java-8 java-17

7
推荐指数
1
解决办法
5867
查看次数