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

如何在java中使用反射将字段强制转换为特定类?,java,reflection,Java,Reflection,我正在使用反射将属于Card类的所有类成员变量放入ArrayList实例中。如何完成最后一部分(见下面的注释行) ArrayList<Card> cardList = new ArrayList<Card>(); Field[] fields = this.getClass().getDeclaredFields(); for (Field field : fields) { if (field.getType() == Card.class) { /

我正在使用反射将属于
Card
类的所有类成员变量放入
ArrayList
实例中。如何完成最后一部分(见下面的注释行)

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?
ArrayList cardList=new ArrayList();
Field[]fields=this.getClass().getDeclaredFields();
用于(字段:字段){
if(field.getType()==Card.class){
//如何将“字段”转换为“卡片”对象并将其添加到此处的“卡片列表”中?

字段
只是对字段的描述,而不是其中包含的值

您需要首先获取值,然后才能强制转换它:

Card x =  (Card) field.get(this);
另外,您可能也希望允许子类,所以您应该这样做

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

  if (Card.class.isAssignableFrom(field.getType()) {
ArrayList cardList=new ArrayList();
Field[]fields=this.getClass().getDeclaredFields();
用于(字段:字段){
if(field.getType()==Card.class){
卡片tmp=(卡片)字段。获取(该字段);
卡片列表。添加(tmp);

为什么需要反射来访问
上的字段?我想获取所有类型为“Card”的字段。“this”在静态方法中不起作用,有什么解决方法可以在静态方法中进行吗?@thilo对于静态字段,可以将
null
传递到
字段。get(null)
。如果您有另一个实例,也可以将其传入,它不必是
this
field.get(anInstance)
。参数(this、null、anInstance等)是什么是否在此处执行?@WVrock指定应访问字段的实例。对于静态字段,它不是必需的,并且可以是
null
。是否可以在不使用
if
语句的情况下强制转换?例如使用
字段本身强制转换它
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);