Tôi nhận thấy một điều rất lạ sau khi thay đổi trường cuối cùng thông qua Reflection, phương thức trả về trường đó là tất cả thời gian cho giá trị cũ. Tôi cho rằng điều này có thể là do trình biên dịch JIT.Thay đổi giá trị cuối cùng được biên soạn bởi JIT
Đây là chương trình mẫu:
public class Main
{
private static final Main m = new Main();
public static Main getM()
{
return m;
}
public static void main(String args[]) throws Exception
{
Main m = getM();
int x = 0;
for(int i = 0;i<10000000;i++)
{
if(getM().equals(m))
x ++;
}
Field f = Main.class.getDeclaredField("m");
f.setAccessible(true);
removeFinal(f);
Main main1 = new Main();
f.set(null, main1);
Main main2 = (Main) f.get(null);
Main main3 = getM();
System.out.println(main1.toString());
System.out.println(main2.toString());
System.out.println(main3.toString());
}
private static void removeFinal(Field field) throws NoSuchFieldException, IllegalAccessException
{
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
}
}
Kết quả là:
[email protected]
[email protected]
[email protected]
tôi tự hỏi, làm thế nào tôi có thể làm getM() return cập nhật giá trị?
Từ khóa 'final' cho phép trình biên dịch nội tuyến. Tại sao bạn cần phải làm điều này? –
Có cách nào để buộc JIT biên dịch lại phương pháp này không? – user3009344
Trình biên dịch javac, không phải là JIT. –