के एक साधारण परीक्षण का मामला साथ शुरू करते हैं:जावा
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());
}
}
किसी का अनुमान लगाना क्या निर्गम (नीचे दिखाया गया के रूप में आश्चर्य तुरंत खराब नहीं करने के लिए) के रूप में प्रिंट किया जाएगा परवाह है।
प्रश्न हैं:
- क्यों आदिम और लिपटे पूर्णांक अलग तरीके से व्यवहार करते हैं?
- परावर्तक बनाम सीधी पहुंच अलग-अलग परिणाम क्यों देता है?
- वह जो मुझे सबसे ज्यादा परेशान करता है - क्यों स्ट्रिंग आदिम
int
की तरह व्यवहार करता है औरInteger
की तरह नहीं?
परिणाम (जावा 1.5):
reflection: primitiveInt = 84
direct: primitiveInt = 42
reflection: wrappedInt = 84
direct: wrappedInt = 84
reflection: stringValue = 84
direct: stringValue = 42
+1: अपना विषय पढ़ने में अच्छा लगा। –
यह कम्पाइलर से कसकर संबंधित हो सकता है। – andy