Динамическая загрузка классов - NON-JDBC, общего назначения: "не удается найти метод символа"

У меня есть несколько кодов, которые анализируют данные, и я понял, что мне хотелось бы иметь немного кода, адаптированного к очень конкретному источнику данных, а не к общей обработке. Любой отдельный источник может меняться со временем, и уже есть несколько различных источников для рассмотрения. Чтобы справиться с этим делом, я запускал из Java полные автономные программы, и это хорошо, но с этим есть некоторые проблемы, и я решил вместо этого использовать динамическую загрузку классов. Я использую Java начиная с версии 1.1 и в целом знаком с большинством проблем с Java, но эта конкретная задача заставляет меня задуматься, использую ли я неправильную версию Java или что-то подобное, потому что полученная ошибка выглядит как вызов метода, который я пытаюсь не известна моя версия. Я думал,может быть, я пропустил жизненно важное заявление импорта?

Я нашел несколько хороших примеров для подражания, лучший из которых, кажется, этот, потому что он делает именно то, что я хотел бы сделать: http://media.techtarget.com/tss/static/articles/content/dm_classForname/DynLoad.pdf

Самый первый пример кода - это именно то, что я хочу сделать, поэтому я извлек из него несколько битов - не сильно отличающихся от того, что я делал самостоятельно (с которым я боролся), но это не Компиляция - различные ошибки "не удается найти символ". Поскольку мой код намного громоздче, я попробовал их все самостоятельно, и он не будет компилироваться, как и мой! Вот этот код:

public class DynamicLoader
{
   public static void main(String[] args) throws Exception
   {
      Class toRun = Class.forName(args[0]);
      Method mainMethod = findMain(toRun);
      mainMethod.invoke(null, new Object[] { args });
   }
   private static Method findMain(Class clazz) throws Exception
   {
      Method[] methods = clazz.getMethods();
      for (int i=0; i<methods.length; i++)
      {
         if (methods[i].getName().equals("main"))
         return methods[i];
      }
      return null;
   }
}

Когда я пытаюсь скомпилировать его, я получаю:

# javac DynamicLoader.java
DynamicLoader.java:11: error: cannot find symbol
   private static Method findMain(Class clazz) throws Exception
                  ^
  symbol:   class Method
  location: class DynamicLoader
DynamicLoader.java:8: error: cannot find symbol
      Method mainMethod = findMain(toRun);
      ^
  symbol:   class Method
  location: class DynamicLoader
DynamicLoader.java:13: error: cannot find symbol
      Method[] methods = clazz.getMethods();
      ^
  symbol:   class Method
  location: class DynamicLoader
3 errors

Моя версия Java: Javac 1.7.0_45

Я предполагаю, что проблема очень проста / проста, но просмотр документации не дал никаких подсказок!

1 ответ

Ну, настойчивость!

Я был почти уверен, что это какая-то проблема с импортом, и это действительно так!

Ключ должен был понять, что класс Method является частью java.lang.reflect. Тем не менее, простой импорт java.lang.reflect не сделал этого. Вот что сделал:

import java.lang.reflect.Method;

Я нашел полезную информацию здесь: http://www.programcreek.com/2013/09/java-reflection-tutorial/

Я был удивлен, что это не было намного более очевидным из онлайн-документации, но, ну, ну, должно быть, это был мой надзор в той или иной мере... Одна из причин, по которой это было особенно трудно определить, заключается в том, что " Метод "встречается в сотнях тысяч статей о Java, и поиск в Интернете сфокусирован на правильных вещах. Другая причина, по которой это было проблемой, заключалась в том, что есть МНОГИЕ примеры, использующие этот код, которые НЕ включают требуемую строку импорта.

Другие вопросы по тегам