我想在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 12的性能比Java 8慢。
这些奇怪的结果有什么解释吗?我在这里想念什么吗?
组态:
Java 8
Java 12
VM选项: -XX:+UseG1GC -server -Xmx1024m -Xms1024m
JMH吞吐量结果:
流+复杂过滤器
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) 我同意以下代码:
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)
我想这个结果是出乎意料的。
我一直在使用JavaDocs for JDK 11
但我注意到iFrames视图似乎不再可用.我环顾四周,但看不出有关为什么要这样做的任何细节,以及有什么替代方案?谁能提供更多细节?
使用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已经阐述了如何功能可以编译和使用运行时期间启用javac和java.
如何使用Maven试用这个功能?
在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)
)
试用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)
有点像我的期望我得到以下错误:
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]) …
当我尝试使用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。
我有一个具有以下结构的小项目:
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
请参考“ …
我似乎偶然发现了一些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 ×10
java-12 ×10
java-11 ×2
javadoc ×2
maven ×2
arraylist ×1
benchmarking ×1
build.gradle ×1
collections ×1
gradle ×1
groovy ×1
java-8 ×1
java-stream ×1
javac ×1
jmh ×1
reflection ×1
unit-testing ×1