エステバン・S:
どのように反復処理し、非インスタンス化クラスのすべてのフィールドの値を取得します:
import java.lang.reflect.Field;
public class NonInstantiableClass {
private Integer a1 = 1;
private String a2 = "a";
private NonInstantiableClass () {
throw new AssertionError();
}
public static void printVariables () throws IllegalAccessException {
for (Field field : NonInstantiableClass.class.getDeclaredFields()) {
field.setAccessible(true);
System.out.println(field.getName()
+ " - " + field.getType()
+ " - " + field.get(NonInstantiableClass.class));
}
}
public static void main(String args[]) throws IllegalAccessException {
NonInstantiableClass.printVariables();
}
}
このコードを考えると、次のエラーを取得します。
Exception in thread "main" java.lang.IllegalArgumentException: Can not set java.lang.Integer field NonInstanciableClass.a1 to java.lang.Class
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
at java.base/java.lang.reflect.Field.get(Field.java:418)
at NonInstanciableClass.printVariables(NonInstanciableClass.java:17)
at NonInstanciableClass.main(NonInstanciableClass.java:23)
クラスはインスタンス化した場合に同じコードがインスタンスで動作します:
import java.lang.reflect.Field;
public class NonInstantiableClass {
private Integer a1 = 1;
private String a2 = "a";
//private NonInstantiableClass () {
// throw new AssertionError();
//}
public static void printVariables () throws IllegalAccessException {
for (Field field : NonInstantiableClass.class.getDeclaredFields()) {
field.setAccessible(true);
System.out.println(field.getName()
+ " - " + field.getType()
+ " - " + field.get(new NonInstantiableClass()));
}
}
public static void main(String args[]) throws IllegalAccessException {
NonInstantiableClass.printVariables();
}
}
この問題を解決するためのより良い方法はありますか?
ありがとうございました。
EDIT:
ディランが指摘したように、クラスがインスタンス化されていない場合は、インスタンスフィールドを初期化することはできません。もちろん、フィールドは静的です。
private static Integer a1 = 1;
private static String a2 = "a";
アリス:
これを試して:
import java.lang.reflect.Field;
public class NonInstantiableClass {
private static Integer a1 = 1;
private static String a2 = "a";
private NonInstantiableClass () {
throw new AssertionError();
}
public static void printVariables () throws IllegalAccessException {
for (Field field : NonInstantiableClass.class.getDeclaredFields()) {
field.setAccessible(true);
System.out.println(field.getName()
+ " - " + field.getType()
+ " - " + field.get(NonInstantiableClass.class));
}
}
public static void main(String args[]) throws IllegalAccessException {
NonInstantiableClass.printVariables();
}
}
これはあなたにかかわらず、静的フィールドを教えてくれます。フィールドが静的でない場合は、getVariableValueはNULLを返します。