2014-11-28 5 views
-1

Так что это мой первый раз, размещение, пожалуйста, быть нежным: 3Class.forName() бросает ClassNotFoundException

Общий обзор:
Моя цель состоит в том, чтобы быть в состоянии дать моей программы файл XSD, то программа генерирует bean, генерирует приятный графический интерфейс, используя отражение в bean-компоненте, затем я могу ввести соответствующие значения в текстовые поля, а затем программа обновляет bean-компонент со значениями и, наконец, выводит компонент в хороший XML-код.

Это идет по довольно хорошо, но вчера я наткнулся на ошибку, что я не могу понять ..

StackTrace

java.lang.ClassNotFoundException: X.Y.Z.BEAN_FILE_WITHOUT_.JAVA 
at java.net.URLClassLoader$1.run(Unknown Source) 
at java.net.URLClassLoader$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Unknown Source) 
at X.Y.Z.GenerateXMLService.generateBean(GenerateXMLService.java:101) 
at X.Y.Z.view.Gui$1.handle(Gui.java:56) 
at X.Y.Z.view.Gui$1.handle(Gui.java:1) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source) 
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source) 
at javafx.event.Event.fireEvent(Unknown Source) 
at javafx.scene.Node.fireEvent(Unknown Source) 
at javafx.scene.control.Button.fire(Unknown Source) 
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source) 
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source) 
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source) 
at javafx.event.Event.fireEvent(Unknown Source) 
at javafx.scene.Scene$MouseHandler.process(Unknown Source) 
at javafx.scene.Scene$MouseHandler.access$1800(Unknown Source) 
at javafx.scene.Scene.impl_processMouseEvent(Unknown Source) 
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source) 
at com.sun.glass.ui.View.handleMouseEvent(Unknown Source) 
at com.sun.glass.ui.View.notifyMouse(Unknown Source) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.access$300(Unknown Source) 
at com.sun.glass.ui.win.WinApplication$4$1.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

generateBean

public Class generateBean(File xsd) { 

    String finalDir = System.getProperty("user.dir") + "/src/main/java"; 
    String xsdDir = xsd.getParentFile().getAbsolutePath(); 

    try { 
     Process p = Runtime.getRuntime().exec(
      "cmd /c cd " + xsdDir + " && xjc -d " + finalDir 
       + " -p PACKAGE_PATH_GOES_HERE " + xsd.getName().toString()); 
     p.waitFor(); 

    } catch (IOException | InterruptedException e) { 
     Gui.errorPopUp(e); 
    } 

    /** 
    * Get the newly created files and put them in an array 
    */ 
    File[] fList = new File[2]; 
    fList = new File("DIRECTORY_PATH_GOES_HERE").listFiles(); 

    /** 
    * Get the file that isn't Objectfactory.java ---> that's the bean 
    */ 
    for (File file : fList) { 
     if (!"ObjectFactory.java".equals(file.getName())) { 

      String beanName = file.getName(); 

      String beanBinaryName = "PACKAGE_PATH_GOES_HERE" 
       + beanName.substring(0, beanName.length() - 5); 

      Class beanClass = null; 
      try { 

       beanClass = Class.forName(beanBinaryName); //this is line 101 
       return beanClass; 

      } catch (ClassNotFoundException e) { 
       Gui.errorPopUp(e); 
      } 

     } 
    } 
    return null; 

} 

Поэтому я сначала проверил, правильно ли beanBinaryName, и я думаю, что это так. Он имеет следующий формат:

com.foo.foo.some.more.foo.beanbag.bean

Тогда я начал прибегая к помощи с сообщением об ошибке и споткнулся accross это сообщение:
Link to the blog

Но, честно говоря, я не совсем понял, что он пытался объяснить. Стектура выглядит похожей, но я только что начал с java несколько месяцев назад и все еще считаю себя новичком. Есть ли у вас какие-либо советы о том, что может быть причиной ошибки? Заранее спасибо!

EDIT/РЕШЕНИЕ:

Моя первая ошибка пытается использовать Class.forName() на файле .java. Это работает только с скомпилированными файлами, например. .класс.

После того, как я исправил, что я все еще получаю сообщения об ошибках, но после игры с URLClassLoader он работал: DI переименовал и реорганизовал этот метод по сравнению с методом вверху, поэтому в этом мы действительно получаем только класс, в то время как в моем первом примере я также создаю .java-файлы. Теперь я делаю это в отдельном методе, чтобы все было организовано.

public Class getClassFromBean() { 

    File[] fList = new File[3]; 
    fList = new File("foo/beanbag").listFiles(); 
    Class beanClass = null; 

    for (File file : fList) { 

     String lastSix = file.getName().toString().substring(file.getName().length() - 6); 

     if (".class".equals(lastSix)) { 

      String beanBinaryName = "foo.beanbag." 
       + file.getName().toString().substring(0, file.getName().toString().length() - 6); 

      try { 
       File root = new File(System.getProperty("user.dir") + "/src/main/java"); 
       URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI() 
        .toURL() }); 
       beanClass = Class.forName(beanBinaryName, true, classLoader); 
      } catch (ClassNotFoundException | MalformedURLException e) { 
       Gui.errorPopUp(e); 
      } 

      return beanClass; 

     } 

    } 
    return beanClass; 

} 
+0

Вы генерируете файл .class? – anstarovoyt

+0

Проверьте, что ch.bedag.ste.lehrling.aze.reflection.beanbag.Durchstich в пути класса – talex

+0

@anstarovoyt Вы имеете в виду с командной строкой (процесс p)? Это дает мне два файла: BEAN_THAT_I_WANT.java и Objectfactory.java. – anon

ответ

1

Метод Class.forName() работает только для скомпилированных классов, т.е. для файлов с расширением».class'. Вы не можете просто поместить файл .java в свой путь к классам.

+0

Хм хорошо .. Так что если я использую файл, то скомпилируйте его с помощью _javac_ и продолжайте его работу ? – anon

+0

@anon Я не уверен, потому что это зависит от реализации класса и т. Д.Вы можете посмотреть на этот вопрос http://stackoverflow.com/questions/2946338/how-do-i-programmatically-compile-and-instantiate-a-java-class – anstarovoyt

+0

Извините, мне потребовалось столько времени, чтобы обновить этот вопрос. У меня нет хорошего оправдания. Лучше поздно, чем никогда, поэтому я хотел поблагодарить вас за то, что вы указали мне в правильном направлении с вашей ссылкой. :) – anon

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