23 EKİM 2009, Cuma
Java değiştirme son alanları
Hadi basit bir test çalışması ile başlar:
import java.lang.reflect.Field;
public class Test {
private final int primitiveInt = 42;
private final Integer wrappedInt = 42;
private final String stringValue = "42";
public int getPrimitiveInt() { return this.primitiveInt; }
public int getWrappedInt() { return this.wrappedInt; }
public String getStringValue() { return this.stringValue; }
public void changeField(String name, Object value) throws IllegalAccessException, NoSuchFieldException {
Field field = Test.class.getDeclaredField(name);
field.setAccessible(true);
field.set(this, value);
System.out.println("reflection: " name " = " field.get(this));
}
public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
Test test = new Test();
test.changeField("primitiveInt", 84);
System.out.println("direct: primitiveInt = " test.getPrimitiveInt());
test.changeField("wrappedInt", 84);
System.out.println("direct: wrappedInt = " test.getWrappedInt());
test.changeField("stringValue", "84");
System.out.println("direct: stringValue = " test.getStringValue());
}
}
Herkes çıktı (sürpriz hemen değil bozmak gibi alt kısmında gösterilen) olarak basılmış ne olacağını tahmin etmek ister.
Sorular:
- Neden ilkel ve sarılmış tamsayı farklı davranır mı?
- Neden yansıtıcı vs doğrudan erişim farklı sonuçlar verir mi?
- Beni en çok veba - neden String gibi ilkel
int
uslu veInteger
gibi değil mi?
Sonuçlar (java 1.5):
reflection: primitiveInt = 84
direct: primitiveInt = 42
reflection: wrappedInt = 84
direct: wrappedInt = 84
reflection: stringValue = 84
direct: stringValue = 42
CEVAP
23 EKİM 2009, Cuma
Derleme zamanı sabitleri inlined-derleme zamanında javac (). Bu İDEA bakın, özellikle 15.28'de sabit tanımlar ifade ve 13.4.9 anlatılır ikili uyumluluk ya son alanlar ve sabitler.
Eğer alan-son sigara ya da olmayan bir derleme zamanı sabiti atama yaparsanız, değer değil inlined. Örneğin:
özel final String = null!=çağrısı"": null? ""; . 42
Bunu Paylaş:
En iyi şekilde Java dosyaları Listelem...
Java?geçerli çalışma dizini değiştirme...
Sadece statik alanları Java sınıfta bi...
'sabitler' paylaşım için java...
'Java numaralama avantajı ne vers...