Код с использованием классов и интерфейсов - PullRequest
0 голосов
/ 03 октября 2009

Я новичок в Java, но понимаю основы. Я знаю, что интерфейсы являются абстрактными классами, и они используются для эмуляции множественного наследования (вроде - я знаю, что в Java это не разрешено). У меня есть этот код; Вы мне это объясните?

Вот часть метода, который перебирает список классов:

Constructor[] c = aClass.getConstructors();
for (Constructor constructor : c) {
  if (constructor.getParameterTypes().length == 0) {
    AInterface action = (AInterface) constructor.newInstance();
    try {
      action.run(request, response);
    }
  }
}

Вот определение интерфейса, использованное в приведенном выше коде:

public interface AInterface 
{
  void run(HttpServletRequest request, HttpServletResponse response);
}

Ответы [ 3 ]

2 голосов
/ 03 октября 2009

Он использует отражение для создания экземпляра класса, чей объект java.lang.Class хранится в переменной aClass, используя конструктор с нулевым аргументом (если он есть), а затем вызывает его методов (предполагается реализовать AInterface).

Этот код выглядит так, будто он из какой-то веб-инфраструктуры. Почему ты смотришь на это? Reflection - это одна из наиболее продвинутых вещей в Java, а не то, с чем обычно приходится сталкиваться новичкам.

Для чего вызывается метод run, если метод run не имеет тела? Для чего это хорошо?

Созданный класс (aClass) является конкретным классом, а не интерфейсом, и он будет реализовывать интерфейс и содержать тело метода run. Вам нужно больше узнать об интерфейсах (Google - ваш друг).

2 голосов
/ 03 октября 2009
Constructor[] c = aClass.getConstructors();  // Retrieve all the constructors 
                                             // of the class 'aClass' 
for (Constructor constructor : c) { // Iterate all constructors
    // Until the only default constructor is found.
    if (constructor.getParameterTypes().length == 0) { 
    // Create a new instance of 'aClass' using the default constructor
    // Hope that 'aClass' implements 'AInterface' otherwise ClassCastException ...
    AInterface action = (AInterface) constructor.newInstance();
    try {
      // action has been cast to AInterface - so it can be used to call the run method
      // defined on the AInterface interface. 
      action.run(request, response);
    } // Oops - missing catch and/or finally. That won't compile
  }
}
// Missing a bit of error handling here for the countless reflection exception
// Unless the method is declared as 'throws Exception' or similar

Пример использования:

У вас есть класс где-то с именем 'TheClass'

public class TheClass implements AInterface {
    public void run(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("Hello from TheClass.run(...)");
        // Implement the method ...
    }
}

Где-то в приложении, либо используя Reflection, либо читая файл конфигурации. Приложение обнаруживает, что должно выполнить «TheClass». У вас нет никаких указаний на TheClass, кроме того, что он должен реализовывать AInterface и у него есть конструктор по умолчанию.

Вы можете создать объект Class, используя

Class aClass = Class.forName("TheClass");

и используйте «aClass» в предыдущем фрагменте кода (после добавления кода для обработки ошибок). Вы должны увидеть в консоли

Hello from TheClass.run(...)
2 голосов
/ 03 октября 2009

Он ищет конструктор с 0 аргументами для класса AClass. Там не будет больше, чем один. :)

Затем он создает экземпляр этого класса, используя этот конструктор.

Затем он вызывает метод "run" этого класса с двумя объектами.

Надеюсь, это поможет.

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