Java - getConstructor ()? - PullRequest
       30

Java - getConstructor ()?

4 голосов
/ 24 апреля 2010

Я написал вопрос в виде комментария в коде, я думаю, что так легче понять.

public class Xpto{
    protected AbstractClass x;

    public void foo(){

       // AbstractClass y = new ????? Car or Person ?????

       /* here I need a new object of this.x's type (which could be Car or Person)
          I know that with x.getClass() I get the x's Class (which will be Car or 
          Person), however Im wondering how can I get and USE it's contructor */

       // ... more operations (which depend on y's type)
    }

}

public abstract class AbstractClass {
}

public class Car extends AbstractClass{
}

public class Person extends AbstractClass{
}

Есть предложения?

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 24 апреля 2010

Прежде всего, BalusC прав.

Во-вторых:

Если вы принимаете решения на основе типа класса, вы не позволяете полиморфизму выполнять свою работу.

Ваша классовая структура может быть неправильной (как Car и Person не должны быть в одной иерархии)

Возможно, вы могли бы создать интерфейс и код для него.

interface Fooable {
     Fooable createInstance();
     void doFoo();
     void doBar();
}

class Car implements Fooable {
     public Fooable createInstance() {
          return new Car();
     }
     public void doFoo(){
         out.println("Brroooom, brooooom");
     }
     public void doBar() {
          out.println("Schreeeeeeeekkkkkt");
      }
}
class Person implements Fooable {
     public Fooable createInstance(){   
         return new Person();
      }
      public void foo() {
           out.println("ehem, good morning sir");
      }
      public void bar() {
          out.println("Among the nations as among the individuals, the respect for the other rights means peace..");// sort of 
      }
}

Позже ...

public class Xpto{
    protected Fooable x;

    public void foo(){
         Fooable y = x.createInstance();
         // no more operations that depend on y's type.
         // let polymorphism take charge.
         y.foo();
         x.bar();
    }
}
3 голосов
/ 24 апреля 2010

Если у класса есть (неявный) конструктор по умолчанию без аргументов, тогда вы можете просто вызвать Class#newInstance(). Если вы хотите получить определенный конструктор, используйте Class#getConstructor(), в котором вы передаете типы параметров, а затем вызываете Constructor#newInstance() для него. Код, выделенный синим цветом, на самом деле является ссылками, щелкните их, чтобы получить Javadoc, в нем содержится подробное объяснение того, что именно делает метод. Чтобы узнать больше об отражении, перейдите к учебнику Sun по этому предмету .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...