2016-09-22 4 views
0

У меня есть программа, в которой я генерирую классы во время выполнения (включая только переменные и связанные методы получения и настройки). Позже я хочу заполнить классы.Не удается найти класс с Class.forName(), но он существует

Чтобы получить класс - я знаю его имя, но его нет в пути к классам - я пробовал .forName(), но всегда получаю исключение ClassNotFoundException.

Вот мой пример:

Exception in thread "main" java.lang.ClassNotFoundException: com.test.wam.business.wsobjects.Testclass 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:264) 
at gui.Application.main(Application.java:94) 

И код:

URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
    DynamicURLClassLoader dynamicURLClassLoader = new DynamicURLClassLoader(urlClassLoader); 
    dynamicURLClassLoader.addURL(new URL("file://C:\\dev\\Eclipse_was\\guitest\\generated")); 

    Class c = Class.forName("com.test.wam.business.wsobjects.Testclass"); 

    Object classInstance = c.newInstance(); 

ClassLoader:

public class DynamicURLClassLoader extends URLClassLoader { 

public DynamicURLClassLoader(URLClassLoader classLoader) { 
    super(classLoader.getURLs()); 
} 

@Override 
public void addURL(URL url) { 
    super.addURL(url); 
} 

}

Полное квалифицированное имя для файла (созданный с помощью e Clipse -> скопировать полный квалифицированное имя)

/guitest/generated/com/test/wam/business/wsobjects/Testclass.java

Что здесь не так?

+2

"но его не в пути к классам". Что. –

+1

'Class.forName' нужны' class' файлы, 'Testclass.java' - нет. – passion

+0

что я могу сделать в этом случае - у меня есть только созданные Java-файлы и файлы классов? – Lasirana

ответ

0

Метод Class.forName(String) использует ClassLoader класса вызывающего абонента, если вы хотите использовать определенную ClassLoader загрузить свой класс, нужно использовать Class.forName(String name, boolean initialize, ClassLoader loader) вместо в следующем:

Class c = Class.forName(
    "com.test.wam.business.wsobjects.Testclass", true, dynamicURLClassLoader 
); 

NB: Это будет работать если и только URL, который вы предоставляете на свой DynamicURLClassLoader, является действительным и представляет собой путь к родительской папке, в которой у вас есть свой класс

1

Я вижу две проблемы:

1) Вы создаете DynamicURLClassLoader и добавляете к нему URL-адрес, но на самом деле вы его не используете. Данное заявление:

Class c = Class.forName("com.test.wam.business.wsobjects.Testclass"); 

будет использовать загрузчик классов, загружающий текущий класс. Это, вероятно, стандартный загрузчик классов по умолчанию, но это, безусловно, НЕ тот, что вы только что создали. javadoc говорит:

[Class.forName(className)] возвращает Class объект, связанный с классом или интерфейсом с заданным именем строки. Вызов этого метода эквивалентно:

Class.forName(className, true, currentLoader) 

где currentLoader обозначает определяющий загрузчик классов текущего класса.

So ....решение:

Class c = Class.forName("com.test.wam.business.wsobjects.Testclass", 
         true, dynamicURLClassLoader); 

2) Эта строка:

"file://C:\\dev\\Eclipse_was\\guitest\\generated" 

не является допустимым "файл:" URL. Правильный URL для пути вы пытаетесь ссылки будет:

"file:///C:/dev/Eclipse_was/guitest/generated" 

путь, который вы написали URL мог бы работать, но это не правильный способ сделать это.

Ссылка:

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