List
たとえば、いくつかのオブジェクトでカスタムを返すメソッドがあるとします。彼らは私のように返されObject
ます。これらのオブジェクトから特定のフィールドの値を取得する必要がありますが、オブジェクトのクラスがわかりません。
これをReflecionまたは他の方法で行う方法はありますか?
List
たとえば、いくつかのオブジェクトでカスタムを返すメソッドがあるとします。彼らは私のように返されObject
ます。これらのオブジェクトから特定のフィールドの値を取得する必要がありますが、オブジェクトのクラスがわかりません。
これをReflecionまたは他の方法で行う方法はありますか?
Javaジェネリックを使用して、そのリストにあるオブジェクトのタイプを指定することを強くお勧めします。List<Car>
. Cars と Trucks がある場合は、このような共通のスーパークラス/インターフェイスを使用できますList<Vehicle>
。
ただし、以下の実行可能な例のようにプライベートであっても、Spring の ReflectionUtils を使用してフィールドにアクセスできるようにすることができます。
List<Object> list = new ArrayList<Object>();
list.add("some value");
list.add(3);
for(Object obj : list)
{
Class<?> clazz = obj.getClass();
Field field = org.springframework.util.ReflectionUtils.findField(clazz, "value");
org.springframework.util.ReflectionUtils.makeAccessible(field);
System.out.println("value=" + field.get(obj));
}
これを実行すると、次の出力が得られます。
値=[C@1b67f74
値=3
フィールドがどのクラスにあるかがわかっている場合は、リフレクションを使用してアクセスできます。この例 (Groovy にありますが、メソッド呼び出しは同じです) は、クラス Foo の Field オブジェクトを取得し、 object の値を取得しますb
。オブジェクトの具体的なクラスを正確に気にする必要がないことを示しています。重要なのは、フィールドが存在するクラスを知っていることと、そのクラスがオブジェクトの具体的なクラスまたはスーパークラスのいずれかであることです。
groovy:000> class Foo { def stuff = "asdf"}
===> true
groovy:000> class Bar extends Foo {}
===> true
groovy:000> b = new Bar()
===> Bar@1f2be27
groovy:000> f = Foo.class.getDeclaredField('stuff')
===> private java.lang.Object Foo.stuff
groovy:000> f.getClass()
===> class java.lang.reflect.Field
groovy:000> f.setAccessible(true)
===> null
groovy:000> f.get(b)
===> asdf
もう1つの方法があります。私のプロジェクトで同じ状況になりました。私はこの方法で解決しました
List<Object[]> list = HQL.list();
上記の休止状態のクエリ言語では、オブジェクトがどの場所にあるかを知っているので、私がしたことは次のとおりです。
for(Object[] obj : list){
String val = String.valueOf(obj[1]);
int code =Integer.parseint(String.valueof(obj[0]));
}
このようにして、混合オブジェクトを簡単に取得できますが、どの場所でどの値を取得しているかを事前に知っておく必要があります。または、値を出力して確認することもできます。悪い英語で申し訳ありませんが、これが役立つことを願っています