在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)
)
我正在玩泛型,并发现,令我惊讶的是,以下代码编译:
class A {}
class B extends A {}
class Generic<T> {
private T instance;
public Generic(T instance) {
this.instance = instance;
}
public T get(){ return instance; }
}
public class Main {
public static void main(String[] args) {
fArray(new B[1], new Generic<A>(new A())); // <-- No error here
}
public static <T> void fArray(T[] a, Generic<? extends T> b) {
a[0] = b.get();
}
}
Run Code Online (Sandbox Code Playgroud)
我希望T被推断B.A不延伸B.那么编译器为什么不抱怨呢?
T似乎是推断Object,因为我也可以通过 …
尝试从jdk 10切换到11并且无法确定哪个库调用此异常:
Caused by: org.gradle.api.GradleException: failed to read class file ../../SomeTestFile.class
...
...
Caused by: java.lang.UnsupportedOperationException
at org.objectweb.asm.ClassVisitor.visitNestMemberExperimental(ClassVisitor.java:248)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:651)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:391)
at org.gradle.api.internal.tasks.testing.detection.AbstractTestFrameworkDetector.classVisitor(AbstractTestFrameworkDetector.java:124)
Run Code Online (Sandbox Code Playgroud)
我正在使用gradle包装器(v4.10.2),其中包括build.gradle:
buildscript {
ext {
springBootVersion = '2.0.5.RELEASE'
schemaDownloadVersion = '1.6'
generateAvroVersion = '0.14.2'
}
repositories {
mavenCentral()
maven { url "https://plugins.gradle.org/m2/" }
maven { url "http://packages.confluent.io/maven/" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("gradle.plugin.com.amit.plugin.download-registry:registry-schema-download-plugin:${schemaDownloadVersion}")
classpath("com.commercehub.gradle.plugin:gradle-avro-plugin:${generateAvroVersion}")
}
}
apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'com.amit.plugin.download-registry'
apply plugin: 'com.commercehub.gradle.plugin.avro' …Run Code Online (Sandbox Code Playgroud) 在通过 HTTP/2 测试 Open JDK 11 HTTP 客户端时,有一个服务器端错误,看起来像是 JDK 11 错误。
该测试针对 Tomcat 9 服务器运行多个线程,测试所有线程是否使用 HTTP/2 和 TLS1.3。
令人担忧的是错误在“sun.security.ssl.SSLHandshake.produce”内部,这意味着它不是Tomcat,而是导致错误的JDK。
任何人都可以确认您在对 JDK 11 的 HTTP 层进行负载测试时有相同的经验吗?如果是这样,我会向 Open JDK 团队报告。
该错误仅在运行负载测试时才明显:
java.util.NoSuchElementException: No value present
at java.base/java.util.Optional.get(Optional.java:148) ~[na:na]
at java.base/sun.security.ssl.ServerHello$T13ServerHelloProducer.produce(ServerHello.java:551) ~[na:na]
at java.base/sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:436) ~[na:na]
at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.goServerHello(ClientHello.java:1224) ~[na:na]
at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.consume(ClientHello.java:1160) ~[na:na]
at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:849) ~[na:na]
at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.consume(ClientHello.java:810) ~[na:na]
at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392) ~[na:na] ...
Run Code Online (Sandbox Code Playgroud)
这个github项目用于测试。有关更多详细信息,请参阅项目自述文件。
我正在阅读 java 21 new future java21 unnamed,并且我尝试在 try-with-resource 中使用 unnamed ,但我收到错误:加载主类时发生 LinkageError ,Resoen 是 java.lang.ClassFormatError:非法字段名称上课时的“”,是不是因为这个功能还没有开发出来或者是预览版,所以不稳定?还是我的使用方式有问题?
try (var _ = new FileInputStream("/Users/task/Desktop/ttt")) {
} catch (IOException e) {
throw new RuntimeException(e);
}
Run Code Online (Sandbox Code Playgroud)
请告诉我相关信息。谢谢。
我已经安装了OpenJDK 11.0.1,当我尝试使用mvn install运行我的应用程序时,我收到以下错误,我已经通过将javax.xml.bind添加到我的pom.xml中添加了必要的依赖项作为修复,但它没有似乎工作,任何人都面临这个问题?我还需要做其他事吗?我的mvn --version返回此
Maven home: /usr/local/Cellar/maven/3.5.2/libexec
Java version: 11.0.1, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
Default locale: en_GB, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.2", arch: "x86_64", family: "mac"
Run Code Online (Sandbox Code Playgroud)
我添加这个,但没有解决问题
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这就是我得到的
[INFO] --- maven-failsafe-plugin:2.20:integration-test (failsafe-integration-tests) @ name-sample-test ---
[WARNING] Error injecting: org.apache.maven.plugin.failsafe.IntegrationTestMojo
java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3138)
at java.base/java.lang.Class.getDeclaredConstructors(Class.java:2358)
at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:245)
at com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:99)
at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:658)
at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:882)
at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:805)
at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:282)
at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:214)
at com.google.inject.internal.InjectorImpl.getProviderOrThrow(InjectorImpl.java:1006)
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1038)
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1001) …Run Code Online (Sandbox Code Playgroud) 请看一下我的代码:
Object longL = 2548214;
Map<String, Object> map = new HashMap<String, Object>(1);
map.put("LongNumber", longL);
List<Map<String, Object>> returnlist = new ArrayList(10);
returnlist.add(map);
List<Object> versionMap1 = new ArrayList(10);
versionMap1.add(returnlist);
List<Map<String, String>> docIdVersionNameMap = new ArrayList<>();
docIdVersionNameMap.addAll((List<Map<String, String>>)versionMap1.get(0));
Map<String, String> versionDoc=docIdVersionNameMap.get(0);
Map<String,String> versionDocInfo=new HashMap<String,String>(1);
versionDocInfo.put(versionDoc.get("LongNumber"),"abc");
System.out.println(versionDocInfo.toString());
Run Code Online (Sandbox Code Playgroud)
在Java_1.8_60(编译并运行)中,此代码运行良好,但是在Java 11中编译并运行时,它将引发以下异常:
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of l
oader 'bootstrap')
at teststringandlong.Trial.main(Trial.java:35)
Run Code Online (Sandbox Code Playgroud)
Java 11中有关HashMap的变化吗?
我有点惊讶的是,该hashCode()方法的默认(本机)实现比以下基准测试的方法的简单覆盖慢了大约 50 倍。
考虑一个Book不覆盖的基本类hashCode():
public class Book {
private int id;
private String title;
private String author;
private Double price;
public Book(int id, String title, String author, Double price) {
this.id = id;
this.title = title;
this.author = author;
this.price = price;
}
}
Run Code Online (Sandbox Code Playgroud)
或者,考虑一个完全相同的Book类,BookWithHash,它hashCode()使用 Intellij 的默认实现覆盖该方法:
public class BookWithHash {
private int id;
private String title;
private String author;
private Double price;
public …Run Code Online (Sandbox Code Playgroud) 考虑以下函数:
int foo(int[] indices) {
int[] lookup = new int[256];
fill(lookup); // populate values, not shown
int sum = 0;
for (int i : indices) {
sum += lookup[i & 0xFF]; // array access
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
现代 HotSpot 可以消除lookup[i & 0xFF]访问的边界检查吗?此访问不能越界,因为i & 0xFF范围在 0-255 之间,并且数组有 256 个元素。
java optimization performance jvm-hotspot bounds-check-elimination
每次使用时java.exe都会出现这样的警告:
PowerShell > java -version
[0.052s][warning][jni,resolve] Re-registering of platform native method: java.lang.PanwHooks.NativeMethodEntry(Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V from code in a different classloader
java version "18.0.2" 2022-07-19
Java(TM) SE Runtime Environment (build 18.0.2+9-61)
Java HotSpot(TM) 64-Bit Server VM (build 18.0.2+9-61, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)
不管JDK版本如何。jdk1.8.0_211无论是、 、还是jdk-11.0.14,行为都是相同的。OpenJDK 1.8、11、17 和 18 也是如此。jdk-17.0.2jdk-18.0.2
我找不到导致这种情况发生的设置在哪里。任何建议将不胜感激。
环境是windows 10。
java ×10
java-11 ×4
generics ×2
performance ×2
arrays ×1
gradle ×1
hashmap ×1
java-12 ×1
java-8 ×1
jmh ×1
jvm-hotspot ×1
optimization ×1
reflection ×1
spring-boot ×1
type-safety ×1
unit-testing ×1