Java : Field (リフレクション) - API使用例
Field (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
Fieldは、クラスまたはインタフェースについての情報、それらへの動的なアクセス、その単一フィールドを提供します。 リフレクトされたフィールドが、クラス(static)フィールドまたはインスタンス・フィールドであることもあります。
Field を使うと、例えば private なフィールドにも動的にアクセスできるようになります。
public class AccessTest {
private int num = 100;
}
final var field = AccessTest.class.getDeclaredField("num");
System.out.println(field); // private int AccessTest.num
final var obj = new AccessTest();
System.out.println(field.canAccess(obj)); // false
//field.getInt(obj); // IllegalAccessException
System.out.println(field.trySetAccessible()); // true
System.out.println(field.canAccess(obj)); // true
System.out.println(field.getInt(obj)); // 100
Memberで宣言されたフィールド
DECLARED, PUBLIC
「Java API 使用例 : Member」をご参照ください。
メソッド
boolean equals (Object obj)
このFieldを指定されたオブジェクトと比較します。
class A {
int num;
String str;
}
final var a1 = new A();
final var a2 = new A();
final var num1 = a1.getClass().getDeclaredField("num");
final var num2 = a2.getClass().getDeclaredField("num");
System.out.println(num1.equals(num2)); // true
final var str = a1.getClass().getDeclaredField("str");
System.out.println(str.equals(num1)); // false
Object get (Object obj)
指定されたオブジェクトについて、このFieldによって表されるフィールドの値を返します。
public class GetTest {
public int num1 = 100;
public String str1 = "abcd";
public static int num2 = 999;
private String str2 = "XYZ";
}
final var cls = GetTest.class;
final var obj = new GetTest();
final var num1 = cls.getDeclaredField("num1");
System.out.println("num1 : " + num1.get(obj));
final var str1 = cls.getDeclaredField("str1");
System.out.println("str1 : " + str1.get(obj));
final var num2 = cls.getDeclaredField("num2");
System.out.println("num2 : " + num2.get(null));
try {
final var str2 = cls.getDeclaredField("str2");
final var ret = str2.get(obj);
} catch (IllegalAccessException e) {
System.out.println("str2 : IllegalAccessException!");
}
// 結果
// ↓
//num1 : 100
//str1 : abcd
//num2 : 999
//str2 : IllegalAccessException!
AnnotatedType getAnnotatedType ()
このFieldによって表されるフィールドの宣言型を指定する型の使用を表すAnnotatedTypeオブジェクトを返します。
public class Foo {
public int num;
public String str;
}
final var cls = Foo.class;
final var numField = cls.getDeclaredField("num");
System.out.println(numField); // public int Foo.num
final var numType = numField.getAnnotatedType();
System.out.println(numType); // int
final var strField = cls.getDeclaredField("str");
System.out.println(strField); // public java.lang.String Foo.str
final var strType = strField.getAnnotatedType();
System.out.println(strType); // java.lang.String
<T extends Annotation> T getAnnotation (Class<T> annotationClass)
存在する場合は、この要素の指定された型の注釈を返し、そうでない場合はnullを返します。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Foo {
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Bar {
}
public class A {
@Foo
public int num;
@Bar
public String str;
}
final var field = A.class.getDeclaredField("num");
System.out.println(field); // public int A.num
final var ret1 = field.getAnnotation(Foo.class);
System.out.println(ret1); // @Foo()
final var ret2 = field.getAnnotation(Bar.class);
System.out.println(ret2); // null
final var field = A.class.getDeclaredField("str");
System.out.println(field); // public java.lang.String A.str
final var ret1 = field.getAnnotation(Foo.class);
System.out.println(ret1); // null
final var ret2 = field.getAnnotation(Bar.class);
System.out.println(ret2); // @Bar()
<T extends Annotation> T[] getAnnotationsByType (Class<T> annotationClass)
この要素に関連付けられている注釈を返します。
@Repeatable(FooArray.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Foo {
String value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FooArray {
Foo[] value();
}
public class A {
@Foo("a1")
@Foo("a2")
public int num;
}
final var field = A.class.getDeclaredField("num");
System.out.println(field);
System.out.println("-- annotations --");
for (final var a : field.getAnnotationsByType(Foo.class)) {
System.out.println(a.annotationType().getSimpleName() + " : " + a.value());
}
// 結果
// ↓
//public int A.num
//-- annotations --
//Foo : a1
//Foo : a2
boolean getBoolean (Object obj)
staticまたはインスタンスbooleanフィールドの値を取得します。
get(Object obj) の使用例もご参照ください。
public class Foo {
public boolean value = true;
public String str = "abcd";
}
final var cls = Foo.class;
final var obj = new Foo();
{
final var field = cls.getDeclaredField("value");
System.out.println(field); // public boolean Foo.value
final var ret = field.getBoolean(obj);
System.out.println(ret); // true
}
{
final var field = cls.getDeclaredField("str");
System.out.println(field); // public java.lang.String Foo.str
try {
final var ret = field.getBoolean(obj);
} catch (IllegalArgumentException e) {
System.out.println(e);
}
// 結果
// ↓
//java.lang.IllegalArgumentException:
// Attempt to get java.lang.String field "Foo.str" with illegal data type
// conversion to boolean
}
byte getByte (Object obj)
staticまたはインスタンスbyteフィールドの値を取得します。
型が違うこと以外は、getInt(Object obj) と使い方は同じです。
API使用例はそちらをご参照ください。
char getChar (Object obj)
char型、または拡大変換によってchar型に変換可能な別のプリミティブ型のstaticまたはインスタンス・フィールドの値を取得します。
get(Object obj) の使用例もご参照ください。
public class Foo {
public char value = 'a';
public String str = "abcd";
}
final var cls = Foo.class;
final var obj = new Foo();
{
final var field = cls.getDeclaredField("value");
System.out.println(field); // public char Foo.value
final var ret = field.getChar(obj);
System.out.println(ret); // a
}
{
final var field = cls.getDeclaredField("str");
System.out.println(field); // public java.lang.String Foo.str
try {
final var ret = field.getChar(obj);
} catch (IllegalArgumentException e) {
System.out.println(e);
}
// 結果
// ↓
//java.lang.IllegalArgumentException:
// Attempt to get java.lang.String field "Foo.str" with illegal data type
// conversion to char
}
Class<?> getDeclaringClass ()
Fieldオブジェクトによって表されるフィールドを宣言するクラスまたはインタフェースを表すClassオブジェクトを返します。
public class AccessTest {
private int num = 100;
}
final var cls = AccessTest.class;
final var field = cls.getDeclaredField("num");
System.out.println(field); // private int AccessTest.num
final var ret = field.getDeclaringClass();
System.out.println(ret); // class AccessTest
System.out.println(cls.equals(ret)); // true
double getDouble (Object obj)
double型、または拡大変換によってdouble型に変換可能な別のプリミティブ型のstaticまたはインスタンス・フィールドの値を取得します。
get(Object obj) の使用例もご参照ください。
public class Foo {
public double value = 1.23;
public String str = "abcd";
}
final var cls = Foo.class;
final var obj = new Foo();
{
final var field = cls.getDeclaredField("value");
System.out.println(field); // public double Foo.value
final var ret = field.getDouble(obj);
System.out.println(ret); // 1.23
}
{
final var field = cls.getDeclaredField("str");
System.out.println(field); // public java.lang.String Foo.str
try {
final var ret = field.getDouble(obj);
} catch (IllegalArgumentException e) {
System.out.println(e);
}
// 結果
// ↓
//java.lang.IllegalArgumentException:
// Attempt to get java.lang.String field "Foo.str" with illegal data type
// conversion to double
}
float getFloat (Object obj)
float型、または拡大変換によってfloat型に変換可能な別のプリミティブ型のstaticまたはインスタンス・フィールドの値を取得します。
型が違うこと以外は、getDouble(Object obj) と使い方は同じです。
API使用例はそちらをご参照ください。
Type getGenericType ()
Fieldオブジェクトで表されるフィールドの宣言タイプを表すTypeオブジェクトを返します。
public class Foo<T> {
public T value;
public int num;
}
final var foo = new Foo<String>();
final var field = foo.getClass().getDeclaredField("value");
System.out.println(field); // public java.lang.Object Foo.value
final var ret1 = field.getGenericType();
System.out.println(ret1); // T
final var ret2 = field.getType();
System.out.println(ret2); // class java.lang.Object
final var field = Foo.class.getDeclaredField("num");
System.out.println(field); // public int Foo.num
final var ret1 = field.getGenericType();
System.out.println(ret1); // int
final var ret2 = field.getType();
System.out.println(ret2); // int
int getInt (Object obj)
int型、または拡大変換によってint型に変換可能な別のプリミティブ型のstaticまたはインスタンス・フィールドの値を取得します。
get(Object obj) の使用例もご参照ください。
public class Foo {
public int value = 123;
public String str = "abcd";
}
final var cls = Foo.class;
final var obj = new Foo();
{
final var field = cls.getDeclaredField("value");
System.out.println(field); // public int Foo.value
final var ret = field.getInt(obj);
System.out.println(ret); // 123
}
{
final var field = cls.getDeclaredField("str");
System.out.println(field); // public java.lang.String Foo.str
try {
final var ret = field.getInt(obj);
} catch (IllegalArgumentException e) {
System.out.println(e);
}
// 結果
// ↓
//java.lang.IllegalArgumentException:
// Attempt to get java.lang.String field "Foo.str" with illegal data type
// conversion to int
}
long getLong (Object obj)
long型、または拡大変換によってlong型に変換可能な別のプリミティブ型のstaticまたはインスタンス・フィールドの値を取得します。
型が違うこと以外は、getInt(Object obj) と使い方は同じです。
API使用例はそちらをご参照ください。
int getModifiers ()
Fieldオブジェクトによって表されるフィールドのJava言語修飾子を整数として返します。
class Foo {
public int a;
protected int b;
private int c;
}
final var cls = Foo.class;
for (final var field : cls.getDeclaredFields()) {
final var mod = field.getModifiers();
System.out.println("name = " + field.getName() + " : mod = " + mod);
System.out.println(" isPublic : " + Modifier.isPublic(mod));
System.out.println(" isProtected : " + Modifier.isProtected(mod));
System.out.println(" isPrivate : " + Modifier.isPrivate(mod));
}
// 結果
// ↓
//name = a : mod = 1
// isPublic : true
// isProtected : false
// isPrivate : false
//name = b : mod = 4
// isPublic : false
// isProtected : true
// isPrivate : false
//name = c : mod = 2
// isPublic : false
// isProtected : false
// isPrivate : true
String getName ()
Fieldオブジェクトによって表されるフィールドの名前を返します。
public class Foo {
public int num;
public String str;
}
final var cls = Foo.class;
final var num = cls.getDeclaredField("num");
System.out.println(num); // public int Foo.num
System.out.println(num.getName()); // num
final var str = cls.getDeclaredField("str");
System.out.println(str); // public java.lang.String Foo.str
System.out.println(str.getName()); // str
short getShort (Object obj)
short型、または拡大変換によってshort型に変換可能な別のプリミティブ型のstaticまたはインスタンス・フィールドの値を取得します。
型が違うこと以外は、getInt(Object obj) と使い方は同じです。
API使用例はそちらをご参照ください。
Class<?> getType ()
Fieldオブジェクトで表されるフィールドの宣言タイプを識別するClassオブジェクトを返します。
このメソッドの使用例は、getGenericType() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
int hashCode ()
このFieldのハッシュ・コードを返します。
class Foo {
int num;
String str;
}
final var cls = Foo.class;
final var ret1 = cls.getDeclaredField("num").hashCode();
System.out.println(ret1); // -1850314582
final var ret2 = cls.getDeclaredField("str").hashCode();
System.out.println(ret2); // -1850317539
boolean isEnumConstant ()
このフィールドが列挙型クラスの要素を表す場合はtrueを返し、そうでない場合はfalseを返します。
enum Foo {
E1,
E2,
}
class Bar {
int num;
}
final var e1 = Foo.class.getDeclaredField("E1");
System.out.println(e1.isEnumConstant()); // true
final var num = Bar.class.getDeclaredField("num");
System.out.println(num.isEnumConstant()); // false
boolean isSynthetic ()
このフィールドが合成フィールドである場合はtrueを返し、そうでない場合はfalseを返します。
class Foo {
int num;
}
final var field = Foo.class.getDeclaredField("num");
System.out.println(field.isSynthetic()); // false
void set (Object obj, Object value)
このFieldオブジェクトによって表される指定されたオブジェクト引数のフィールドを、指定された新しい値に設定します。
public class SetTest {
public int num1 = 100;
public String str1 = "abcd";
public static int num2 = 999;
private String str2 = "XYZ";
}
final var cls = SetTest.class;
final var obj = new SetTest();
final var field = cls.getDeclaredField("num1");
System.out.println(field); // public int SetTest.num1
System.out.println(field.getInt(obj)); // 100
field.set(obj, 456);
System.out.println(field.getInt(obj)); // 456
final var cls = SetTest.class;
final var obj = new SetTest();
final var field = cls.getDeclaredField("str1");
System.out.println(field); // public java.lang.String SetTest.str1
System.out.println(field.get(obj)); // abcd
field.set(obj, "defg");
System.out.println(field.get(obj)); // defg
final var cls = SetTest.class;
final var field = cls.getDeclaredField("num2");
System.out.println(field); // public static int SetTest.num2
System.out.println(field.getInt(null)); // 999
field.set(null, 1000);
System.out.println(field.getInt(null)); // 1000
final var cls = SetTest.class;
final var obj = new SetTest();
final var field = cls.getDeclaredField("str2");
System.out.println(field); // private java.lang.String SetTest.str2
System.out.println(field.canAccess(obj)); // false
//field.set(obj, "AAA"); // IllegalAccessException
System.out.println(field.trySetAccessible()); // true
System.out.println(field.canAccess(obj)); // true
System.out.println(field.get(obj)); // XYZ
field.set(obj, "AAA");
System.out.println(field.get(obj)); // AAA
void setAccessible (boolean flag)
このリフレクトされたオブジェクトのaccessibleフラグを、指定されたブール値に設定します。
public class AccessTest {
private int num = 100;
}
final var field = AccessTest.class.getDeclaredField("num");
final var obj = new AccessTest();
System.out.println(field.canAccess(obj)); // false
field.setAccessible(true);
System.out.println(field.canAccess(obj)); // true
field.setAccessible(false);
System.out.println(field.canAccess(obj)); // false
void setBoolean (Object obj, boolean z)
指定されたオブジェクトについて、フィールドの値をbooleanとして設定します。
set(Object obj, Object value) の使用例もご参照ください。
public class Foo {
public boolean value = true;
public String str = "abcd";
}
final var cls = Foo.class;
final var obj = new Foo();
{
final var field = cls.getDeclaredField("value");
System.out.println(field); // public boolean Foo.value
System.out.println(field.getBoolean(obj)); // true
field.setBoolean(obj, false);
System.out.println(field.getBoolean(obj)); // false
}
{
final var field = cls.getDeclaredField("str");
System.out.println(field); // public java.lang.String Foo.str
try {
field.setBoolean(obj, false);
} catch (IllegalArgumentException e) {
System.out.println(e);
}
// 結果
// ↓
//java.lang.IllegalArgumentException:
// Can not set java.lang.String field Foo.str to (boolean)false
}
void setByte (Object obj, byte b)
指定されたオブジェクトについて、フィールドの値をbyteとして設定します。
型が違うこと以外は、setInt(Object obj, int i) と使い方は同じです。
API使用例はそちらをご参照ください。
void setChar (Object obj, char c)
指定されたオブジェクトについて、フィールドの値をcharとして設定します。
set(Object obj, Object value) の使用例もご参照ください。
public class Foo {
public char value = 'a';
public String str = "abcd";
}
final var cls = Foo.class;
final var obj = new Foo();
{
final var field = cls.getDeclaredField("value");
System.out.println(field); // public char Foo.value
System.out.println(field.getChar(obj)); // a
field.setChar(obj, 'b');
System.out.println(field.getChar(obj)); // b
}
{
final var field = cls.getDeclaredField("str");
System.out.println(field); // public java.lang.String Foo.str
try {
field.setChar(obj, 'b');
} catch (IllegalArgumentException e) {
System.out.println(e);
}
// 結果
// ↓
//java.lang.IllegalArgumentException:
// Can not set java.lang.String field Foo.str to (char)b
}
void setDouble (Object obj, double d)
指定されたオブジェクトについて、フィールドの値をdoubleとして設定します。
set(Object obj, Object value) の使用例もご参照ください。
public class Foo {
public double value = 1.23;
public String str = "abcd";
}
final var cls = Foo.class;
final var obj = new Foo();
{
final var field = cls.getDeclaredField("value");
System.out.println(field); // public double Foo.value
System.out.println(field.getDouble(obj)); // 1.23
field.setDouble(obj, 4.56);
System.out.println(field.getDouble(obj)); // 4.56
}
{
final var field = cls.getDeclaredField("str");
System.out.println(field); // public java.lang.String Foo.str
try {
field.setDouble(obj, 4.56);
} catch (IllegalArgumentException e) {
System.out.println(e);
}
// 結果
// ↓
//java.lang.IllegalArgumentException:
// Can not set java.lang.String field Foo.str to (double)4.56
}
void setFloat (Object obj, float f)
指定されたオブジェクトについて、フィールドの値をfloatとして設定します。
型が違うこと以外は、setDouble(Object obj, double d) と使い方は同じです。
API使用例はそちらをご参照ください。
void setInt (Object obj, int i)
指定されたオブジェクトについて、フィールドの値をintとして設定します。
set(Object obj, Object value) の使用例もご参照ください。
public class Foo {
public int value = 123;
public String str = "abcd";
}
final var cls = Foo.class;
final var obj = new Foo();
{
final var field = cls.getDeclaredField("value");
System.out.println(field); // public int Foo.value
System.out.println(field.getInt(obj)); // 123
field.setInt(obj, 456);
System.out.println(field.getInt(obj)); // 456
}
{
final var field = cls.getDeclaredField("str");
System.out.println(field); // public java.lang.String Foo.str
try {
field.setInt(obj, 456);
} catch (IllegalArgumentException e) {
System.out.println(e);
}
// 結果
// ↓
//java.lang.IllegalArgumentException:
// Can not set java.lang.String field Foo.str to (int)456
}
void setLong (Object obj, long l)
指定されたオブジェクトについて、フィールドの値をlongとして設定します。
型が違うこと以外は、setInt(Object obj, int i) と使い方は同じです。
API使用例はそちらをご参照ください。
void setShort (Object obj, short s)
指定されたオブジェクトについて、フィールドの値をshortとして設定します。
型が違うこと以外は、setInt(Object obj, int i) と使い方は同じです。
API使用例はそちらをご参照ください。
String toGenericString ()
ジェネリック型を含む、このFieldを記述する文字列を返します。
public class Foo<T> {
public T value;
public int num;
}
final var foo = new Foo<String>();
final var field = foo.getClass().getDeclaredField("value");
final var ret1 = field.toGenericString();
System.out.println(ret1); // public T Foo.value
final var ret2 = field.toString();
System.out.println(ret2); // public java.lang.Object Foo.value
final var field = Foo.class.getDeclaredField("num");
final var ret1 = field.toGenericString();
System.out.println(ret1); // public int Foo.num
final var ret2 = field.toString();
System.out.println(ret2); // public int Foo.num
String toString ()
このFieldを記述する文字列を返します。
このメソッドの使用例は、toGenericString() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
AccessibleObjectで宣言されたメソッド
canAccess, getAnnotations, getDeclaredAnnotation, getDeclaredAnnotations, getDeclaredAnnotationsByType, isAccessible, isAnnotationPresent, setAccessible, trySetAccessible
「Java API 使用例 : AccessibleObject」をご参照ください。