私は、次のクラスしているとField.get(ヌル):Aは静的ブロックと静的でない原始的なデータフィールド
public class A {
static {
B.load(A.class);
}
public static final C field1 = new C("key1", "value1");
public static final C field2 = new C("key2", "value2");
public static void main(String[] args) {
System.out.println(A.field1);
}
}
と
public class B {
public static void load(Class<?> clazz) {
for (Field field : clazz.getFields()) {
try {
System.out.println("B.load -> field is " + field.get(null));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
と
public class C {
private final String key;
private final String value;
public C(String key, String value) {
super();
this.key = key;
this.value = value;
}
public String getKey() {
return this.key;
}
public String getValue() {
return this.value;
}
@Override
public String toString() {
return "C [key=" + this.key + ", value=" + this.value + "]";
}
}
です実行私は得る:
B.load -> field is null
B.load -> field is null
C [key=key1, value=value1]
field.get(null)は、実行時にnull値を返すのはなぜですか?私は例外もなく、この動作はJavadocによって説明されていないようです。
おかげで、それは問題を解決しますが、私は理解していないものがまだあります。 Cの代わりにプリミティブなデータ型を使用すると問題が発生しないのはなぜですか(例:static int field1 = 1およびstatic int field2 = 2 B.loadがフィールドの前に宣言されている静的ブロックを含む)? – Laurent
@Laurent私はいくつかの情報で編集します。 –