Динамическая загрузка классов - 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, и поиск в Интернете сфокусирован на правильных вещах. Другая причина, по которой это было проблемой, заключалась в том, что есть МНОГИЕ примеры, использующие этот код, которые НЕ включают требуемую строку импорта.