基类的getFields而不是instanciated

时间:2013-08-27 12:16:49

标签: java reflection

假设我有以下类继承结构:

public class Animal
{
    public Animal()
    {
      setDefault();
    }

    public void setDefault()
    {
      Field[] Fields = this.getClass().getFields();
        for ( Field F : Fields )
        {
         // perform some initialization per field class
         if ( MyObject.class.isAssignableFrom( F.getType() ))
         {
             ( (MyObject) f.get(this)).setValue(0);
         }
         // ...
        }
    }
}

public class Cat extends Animal
{
   public Cat()
   {
      super();
      setDefault();
   }     
}

public class Kitten extends Cat
{
   public MyObject myobject1 = new MyObject();

   public Kitten()
   {
     super();
     setDefault();
   }
}

当我实例化一个Kitten对象时,我在父类setDefault()的{​​{1}}方法中运行,而没有实现Animal成员。我在myobject1尝试初始化它时运行。

是否有办法在每个NullPointerException调用中获取基类类型? 那就是在setDefault()班级中Animal(或左右会产生this.getClass()Animal班级会产生Cat。这是为了设置默认值仅从父类到子类一步一步。

你有其他任何我可以申请的设置吗?

当然,我可以添加一个测试来检查该字段是否为空,但这不是重点。我想将默认值设置为每个类Cat调用的字段。

我无法更改类层次结构,也无法更改成员的声明位置。

2 个答案:

答案 0 :(得分:0)

如果我理解你所要求的是setDefault方法将采用getClass并将获得它所在的课程,这意味着setDefault Animal class只会设置Animal

的字段

如果这就是你要问的那么答案是你不需要做getClass,你可以设置班级成员的默认值。你有权更改它们,因为它们属于你的班级。

另外,您可以覆盖setDefault方法,更改层次结构中每个类的值并调用父函数,以便设置每个成员

答案 1 :(得分:0)

您可以覆盖每个Class中的setDefault()方法。

public class Animal
{
    public Animal()
    {
      setDefault();
    }

    public void setDefault()
    {
      Field[] Fields = this.getClass().getFields();
        for ( Field F : Fields )
        {
         // perform some initialization per field class
         if ( MyObject.class.isAssignableFrom( F.getType() ))
         {
             ( (MyObject) f.get(this)).setValue(0);
         }
         // ...
        }
    }
}

public class Cat extends Animal
{
   public Cat()
   {
      setDefault();
   }  

   @Override
   public void setDefault() {
       // do some special things
   }
}

public class Kitten extends Cat
{
   public MyObject myobject1 = new MyObject();

   public Kitten()
   {
       setDefault();
   }

   @Override
   public void setDefault() {
       // do some special things
   }
}