2016-04-03 5 views
1

Сценарий: У меня есть классы Java в папке на диске. Я хочу вызвать метод из определенного класса, например Regex. Можно ли использовать API Reflection для вызова метода? У меня есть следующий код:Reflection API - ClassNotFound Exception

File dir = new File("H:/TestFolder/sample"); 
    File[] directoryListing = dir.listFiles(); 
    if (directoryListing != null) { 
     for (File child : directoryListing) { 
      File[] dirListing = child.listFiles(); 
      for (File fileName : dirListing) { 
       if (fileName.getName().equals("Regex.java")) { 
        Class<?> clazz; 
        try { 

         clazz = Class.forName("Regex"); 
         Constructor<?> ctor = clazz.getConstructor(); 
         Object regexClass = ctor.newInstance(); 
....} 

Я получаю ClassNotFoundException. Может ли кто-нибудь сказать мне, что я делаю неправильно?

+0

Прежде всего классы не могут быть загружены из исходных файлов Java, которые он должен быть скомпилирован. Если вы хотите загрузить скомпилированные файлы классов из папки, проверьте [this] (http://stackoverflow.com/questions/6219829/method-to-dynamically-load-java-class-files) –

+0

Я бы проверил это 'Regex. class' находится в вашем классе в пакете по умолчанию. –

+0

@PeterLawrey Sir, вам не кажется, что это имя отсутствует в имени класса Class.forName (..) '? Я упомянул об этом в разделе ответов. Пожалуйста, поправьте меня, если я ошибаюсь. –

ответ

1

Класс на самом деле называется [packageName].Regex, потому что вы объявили его в каком-то пакете под названием [packageName].

Редактировать. Питер Лори отметил, что если источник был H:/TestFolder/sample, пакет должен был быть sample. Таким образом, класс будет называться sample.Regex, а не Regex. Предполагается, что базовый пакет не является TestFolder. Если да, то TestFolder.sample.Regex. Я уверен, что вы поняли эту идею. Пожалуйста, прочтите комментарий г-на Лори below.

Class.forName() введите имя класса, которое указывает имя пакета. Из [docs] для переменной className,

имя класса - полное имя требуемого класса.

Эта специфика должна принимать ClassNotFoundException.

Примечание. Я ожидаю, что ваш Regex.java был скомпилирован для создания файла Regex.class. Ваша IDE должна была это сделать.

+0

Чтобы узнать, какой пакет он представляет, посмотрите строку 'package xxx;' в начале файла '.java'. Если такой строки нет, она находится в пакете по умолчанию. –

+0

У меня нет пакета. Это имя JavaProject. Это образец (Извините за образец опечатки). – MadxG

+0

Итак, у вас нет пакета, указанного в верхней части файла, или он называется 'sample' или' Sample'? Было бы неплохо, если вы обновите его в исходном посте. **Примечание**. Если у вас нет указанного пакета, рекомендуется использовать пакет вместо использования '(пакет по умолчанию)'. –

0

Может быть, это глупый вопрос, но. Вы проверили, что эти классы находятся в пути к классам?

Я имею в виду. Это папка src вашего кода или это внешняя папка, которую вы хотите проверить и загрузить?

Классы должны быть в пути к классам, чтобы инициализировать их объекты посредством отражения.

+0

Внешняя папка. Значит, вы имели в виду, что я не могу проверить и загрузить из внешней папки? – MadxG

+0

Вы можете проверить. Но эти файлы будут похожи на текстовые файлы :-). Нет, как классы executesble. – Laiv

Смежные вопросы