我正在使用JNI技术对本机方法进行建模的代码库上。
这是用于java.lang.String#equals(Object)
@MJI
public boolean equals__Ljava_lang_Object_2__Z (MJIEnv env, int objRef, int argRef) {
ElementInfo s1 = heap.get(objRef); // this
ElementInfo s2 = heap.get(argRef);
Fields f1 = heap.get(s1.getField("value")).getFields();
Fields f2 = heap.get(s2.getField("value")).getFields();
char[] c1 = ((CharArrayFields) f1).asCharArray();
char[] c2 = ((CharArrayFields) f2).asCharArray();
这在Java 8上工作正常。但是在Java 9及更高版本中,为字符串的value
字段返回的值是char[]
或byte[]
例如:
char[] chars = new char[] {'a','b','c', 'd'};
String str1 = new String(chars))
"str2".equals(str1);
这里,在对等方法中,我得到了str1
的char数组和"str2"
的字节数组。这是因为字符串在堆中的存储方式不同吗?
仅供参考:
这是我实际上正在处理的代码。我正在尝试使其与Java 9及更高版本兼容:
jpf-core/src/peers/gov/nasa/jpf/vm/JPF_java_lang_String.java#L166-L200
您可能会看到valueField
被强制转换为CharArrayFields。但是当在Java“ 10.0.1”上运行时,valueField有时是一个CharArrayFields,有时是一个ByteArrayFields。