标签: java-12

如何在Mac OSX上安装Java以允许版本切换?

我想在Mac OSX上安装OpenJDK Java 11,并将其与其他JDK一起使用,因为它是一个较新版本.目前,我下载了tar.gz并将其放在我的路径中,但这很难维护.

我发现自动做更多事情的唯一其他安装是通过Homebrew cask进行的Oracle安装,但这是商业JDK,我想要开源的!

brew cask info java
Run Code Online (Sandbox Code Playgroud)

显示:

java:11,28:55eed80b163941c8885ad9298e6d786a https://www.oracle.com/technetwork/java/javase/overview/index.html

它是Oracle JDK而不是OpenJDK,请参阅:https: //discourse.brew.sh/t/how-to-install-openjdk-with-brew/712

从较旧的问题(Mac OS X和多个Java版本)的指示已过时,并给我错误的版本 - Oracle而不是OpenJDK.

更新: 截至2018年10月3日,Homebrew酒桶现在指向OpenJDK 11

java java-12

241
推荐指数
5
解决办法
14万
查看次数

带有-gc true的Java 12与Java 8上流API的神秘微基准测试结果

作为我研究在流中使用复杂过滤器或多个过滤器之间区别的一部分,我注意到Java 12的性能比Java 8慢。

这些奇怪的结果有什么解释吗?我在这里想念什么吗?

组态:

  • Java 8

    • OpenJDK运行时环境(内部版本1.8.0_181-8u181-b13-2〜deb9u1-b13)
    • OpenJDK 64位服务器VM(内部版本25.181-b13,混合模式)
  • Java 12

    • OpenJDK运行时环境(内部版本12 + 33)
    • OpenJDK 64位服务器VM(内部版本12 + 33,混合模式,共享)
  • VM选项: -XX:+UseG1GC -server -Xmx1024m -Xms1024m

  • CPU:8核

JMH吞吐量结果

  • 预热:10次迭代,每次1秒
  • 测量:10次迭代,每次1秒
  • 线程:1个线程,将同步迭代
  • 单位:ops / s

比较表

流+复杂过滤器

public void complexFilter(ExecutionPlan plan, Blackhole blackhole) {
        long count = plan.getDoubles()
                .stream()
                .filter(d -> d < Math.PI
                        && d > Math.E
                        && d != 3
                        && d != 2)
                .count();

        blackhole.consume(count);
    }
Run Code Online (Sandbox Code Playgroud)

流+多个过滤器

public void multipleFilters(ExecutionPlan plan, Blackhole blackhole) {
        long count = plan.getDoubles()
                .stream() …
Run Code Online (Sandbox Code Playgroud)

java benchmarking java-stream jmh java-12

55
推荐指数
1
解决办法
1732
查看次数

为什么Java 12会尝试将切换结果转换为数字?

我同意以下代码:

var y = switch (0) {
    case 0 -> '0';
    case 1 -> 0.0F;
    case 2 -> 2L;
    case 3 -> true;
    default -> 4;
};
System.out.println(y);
System.out.println(((Object) y).getClass().getName());
Run Code Online (Sandbox Code Playgroud)

返回此:

0
java.lang.Character
Run Code Online (Sandbox Code Playgroud)

但是,如果删除布尔值:

var y = switch (0) {
    case 0 -> '0';
    case 1 -> 0.0F;
    case 2 -> 2L;
    default -> 4;
};
System.out.println(y);
System.out.println(((Object) y).getClass().getName());
Run Code Online (Sandbox Code Playgroud)

返回此:

48.0
java.lang.Float
Run Code Online (Sandbox Code Playgroud)

我想这个结果是出乎意料的。

java switch-statement java-12

42
推荐指数
1
解决办法
1933
查看次数

缺少Javadocs JDK 11的iFrame视图

我一直在使用JavaDocs for JDK 11

但我注意到iFrames视图似乎不再可用.我环顾四周,但看不出有关为什么要这样做的任何细节,以及有什么替代方案?谁能提供更多细节?

查看JDK 10 JDK 10的JavaDocs

查看JDK 11 JDK 11的JavaDocs

java javadoc java-11 java-12

40
推荐指数
2
解决办法
2294
查看次数

使用Maven编译JDK12预览功能

使用JDK/12 EarlyAccess Build 10,JEP-325 Switch Expressions已作为JDK中的预览功能集成.表达式的示例代码(如在JEP中一样):

Scanner scanner = new Scanner(System.in);
Day day = Day.valueOf(scanner.next());
switch (day) {
    case MONDAY, TUESDAY -> System.out.println("Back to work.") ;
    case WEDNESDAY -> System.out.println("Wait for the end of week...") ;
    case THURSDAY,FRIDAY -> System.out.println("Plan for the weekend?");
    case SATURDAY, SUNDAY -> System.out.println("Enjoy the holiday!");
}
Run Code Online (Sandbox Code Playgroud)

在哪里Day作为一个枚举

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Run Code Online (Sandbox Code Playgroud)

预览语言和VM特点JEP-12已经阐述了如何功能可以编译和使用运行时期间启用javacjava.

如何使用Maven试用这个功能?

java switch-statement maven java-12 preview-feature

23
推荐指数
3
解决办法
1万
查看次数

获取jdk12中java.lang.reflect.Fields的声明字段

在java8中,可以使用例如访问类java.lang.reflect.Fields的字段。

Field.class.getDeclaredFields();
Run Code Online (Sandbox Code Playgroud)

在java12中(从java9开始),这仅返回一个空数组。即使有

--add-opens java.base/java.lang.reflect=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)

组。

任何想法如何实现这一目标?(Appart认为这可能不是一个好主意,我希望能够通过反射在junit测试期间更改代码中的“ static final”字段。Java8可以通过更改“修饰符”来实现。

Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(myfield, myfield.getModifiers() & ~Modifier.FINAL);
Run Code Online (Sandbox Code Playgroud)

java reflection unit-testing java-12

14
推荐指数
4
解决办法
1233
查看次数

为什么不完整的switch表达式编译成功

试用JDK/12 EarlyAccess Build 20,其中JEP-325 Switch Expressions已作为预览功能集成.表达式的示例代码(如在JEP中一样):

Scanner scanner = new Scanner(System.in);
Day day = Day.valueOf(scanner.next().toUpperCase());
int i = switch (day) {
    case MONDAY,TUESDAY, WEDNESDAY:
        break 0;
    default:
        System.out.println("Second half of the week");
        // ERROR! Group doesn't contain a break with value
};
Run Code Online (Sandbox Code Playgroud)

我试图按照上一个问题中所述的相同步骤,如何使用Maven编译JDK12预览功能并使用命令行执行上面的代码块:

java --enable-preview -jar target/jdk12-updates-1.0.0-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)

有点像我的期望我得到以下错误:

Error: Unable to initialize main class
com.stackoverflow.nullpointer.expression.SwitchExpressionMustComplete
Caused by: java.lang.VerifyError: Bad local variable type Exception
Details:   Location:
    com/stackoverflow/nullpointer/expression/SwitchExpressionMustComplete.main([Ljava/lang/String;)V @66: iload   
Reason:
    Type top (current frame, locals[4]) …
Run Code Online (Sandbox Code Playgroud)

java javac java-12 preview-feature switch-expression

11
推荐指数
1
解决办法
523
查看次数

如何使用Gradle启用Java 12预览功能?

当我尝试使用Gradle 构建具有开关表达式的 Java代码时,会引发以下错误:

error: switch expressions are a preview feature and are disabled by default.
Run Code Online (Sandbox Code Playgroud)

我尝试运行./gradlew build --enable-preview也不起作用。

我正在使用Gradle 5.3.1。

java groovy gradle build.gradle java-12

11
推荐指数
3
解决办法
2875
查看次数

带有maven的Java 11/12 Javadoc无法生成用于测试的Javadocs

我有一个具有以下结构的小项目:

pom.xml

src/main/java/
  module-info.java
  de.ps.pl.te/
    package-info.java
    TE.java

src/test/java/
   de.ps.pl.te.test/
     package-info.java
     TETests.java
Run Code Online (Sandbox Code Playgroud)

同样在我的maven pom中,我定义了javadoc插件,如下所示:

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
          <show>protected</show>
          <failOnError>false</failOnError>
        </configuration>
      </plugin>
Run Code Online (Sandbox Code Playgroud)

现在我在跑步过程中得到了一些奇怪的输出

mvn clean install site
Run Code Online (Sandbox Code Playgroud)

[INFO]生成“ Javadoc”报告--- maven-javadoc-plugin:3.1.0:aggregate-no-fork [错误]提取链接时出错:D:\ work \ eclipse \ java \ FritzBox \ phplib \ target \ javadoc-捆绑选项。忽略它。

[...]

[INFO]生成“ Test Javadoc”报告--- maven-javadoc-plugin:3.1.0:test-aggregate-no-fork

[错误]提取链接时出错:D:\ work \ eclipse \ java \ FritzBox \ phplib \ target \ javadoc-bundle-options。忽略它。

正在加载软件包de.ps.pl.te.test的源文件...

1个错误

[错误]创建javadoc报告时出错:

退出代码:2-Javadoc:错误-软件包de.powerstat.phplib.templateengine.test没有源文件

命令行为:[...] javadoc.exe @options @packages

请参考“ [...]”目录中生成的Javadoc文件。

org.apache.maven.reporting.MavenReportException:

退出代码:2-javadoc:错误-没有软件包de.ps.pl.te.test的源文件

命令行为:[...] javadoc.exe @options @packages

请参考“ …

java javadoc maven java-11 java-12

11
推荐指数
1
解决办法
1607
查看次数

为什么使用不同的ArrayList构造函数会导致内部数组的增长率不同?

我似乎偶然发现了一些ArrayList无法实现的有趣实现。这是一些显示我的意思的代码:

public class Sandbox {

    private static final VarHandle VAR_HANDLE_ARRAY_LIST;

    static {
        try {
            Lookup lookupArrayList = MethodHandles.privateLookupIn(ArrayList.class, MethodHandles.lookup());
            VAR_HANDLE_ARRAY_LIST = lookupArrayList.findVarHandle(ArrayList.class, "elementData", Object[].class);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }

    public static void main(String[] args) {

        List<String> defaultConstructorList = new ArrayList<>();
        defaultConstructorList.add("one");

        Object[] elementData = (Object[]) VAR_HANDLE_ARRAY_LIST.get(defaultConstructorList);
        System.out.println(elementData.length);

        List<String> zeroConstructorList = new ArrayList<>(0);
        zeroConstructorList.add("one");

        elementData = (Object[]) VAR_HANDLE_ARRAY_LIST.get(zeroConstructorList);
        System.out.println(elementData.length);

    }
}
Run Code Online (Sandbox Code Playgroud)

这个想法是如果您创建ArrayList这样的:

List<String> defaultConstructorList = new ArrayList<>();
defaultConstructorList.add("one");
Run Code Online (Sandbox Code Playgroud)

并查看其将报告的内容elementData( …

java collections arraylist java-8 java-12

11
推荐指数
1
解决办法
788
查看次数