如何使用反射在Java中将字段转换为特定类?

19
我正在使用反射将我的类中所有类型为 Card 的成员变量放入一个 ArrayList<Card> 实例中。我该如何完成最后一部分(请参见下面的注释行)?
ArrayList<Card> cardList = new ArrayList<Card>();
Field[] fields = this.getClass().getDeclaredFields();

for (Field field : fields) {
   if (field.getType() == Card.class) {
      //how do I convert 'field' to a 'Card' object and add it to the 'cardList' here?

为什么需要使用反射来访问this上的字段? - rgettman
我想获取所有类型为“Card”的字段。 - ZakTaccardi
2个回答

29

Field 只是字段的描述,它并不是其中包含的值。

您需要先获取该值,然后可以将其转换:

Card x =  (Card) field.get(this);

此外,您可能还想允许子类,因此应该执行以下操作:

Also, you probably want to allow subclasses as well, so you should do

  //  if (field.getType() == Card.class) {

  if (Card.class.isAssignableFrom(field.getType()) {

1
在静态方法中,“this”无法使用,有什么解决方法可以在静态方法中实现它吗?@Thilo - Jeetendra Ahuja
3
对于静态字段,您可以将 null 传递给 field.get(null)。如果您有另一个实例,也可以将其传递进去,它并不一定是 thisfield.get(anInstance) - Thilo
这里的参数(this,null,anInstance, whatever)是做什么用的? - WVrock
1
@WVrock它指定应访问字段的实例。对于静态字段,这是不必要的,可以为null - Thilo

6
ArrayList<Card> cardList = new ArrayList<Card>();
Field[] fields = this.getClass().getDeclaredFields();    

for (Field field : fields) {
   if (field.getType() == Card.class) {
      Card tmp = (Card) field.get(this);
      cardList.add(tmp);

@EbrahimKarimi,你找到解决问题的方法了吗? - mang4521

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接