Сделать экземпляр класса в Java во время выполнения - PullRequest
1 голос
/ 28 марта 2010

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

String[] args = {"-d","D:\\path\\build\\classes","-s","D:\\path\\src","http://services.aonaware.com/DictService/DictService.asmx?WSDL"};
WsImport.doMain(args);
URL url = new URL("file:D:/path/build/classes/com/aonaware/services/webservices/");
URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url});
Class service = Class.forName("com.MyClass",true,urlClassLoader );

получаю java.lang.ClassNotFoundException

Если я запускаю программу еще раз (в Eclipse), то она работает. На самом деле мне нужно только обновить проект в Eclipse, а затем он работает

Кто-нибудь видит проблему

Ответы [ 4 ]

2 голосов
/ 28 марта 2010

Похоже на проблему с classpath. Убедитесь, что рассматриваемый класс (или содержащий его jar-файл) скомпилирован и находится в пути к классам.

Что именно вы подразумеваете под "динамическим генерированием классов"? Если вы генерируете исходный файл Java для класса, его необходимо сначала скомпилировать в файл класса, прежде чем загрузчик классов сможет его забрать. Может быть, Eclipse сделает это во втором раунде, поэтому он работает тогда.

1 голос
/ 29 марта 2010

Прочитайте документы на URLClassLoader: Предполагается, что любой URL, заканчивающийся символом /, ссылается на каталог.

Кроме того, вы, вероятно, должны использовать '/' в качестве разделителя вместо \\.

Добавление:

Ну, ваш код отлично работает для меня - если в каталоге, указанном в качестве URL, есть фактические скомпилированные классы Java. Но когда вы говорите

В моей программе я генерирую классы динамически

Вы генерируете исходный код Java или байт-код напрямую? Если это исходный код, вы также компилируете его из своего приложения?

1 голос
/ 29 марта 2010

Используйте форму с тремя аргументами Class.forName (), которая требует, чтобы вы указали ClassLoader. [Java API Link] [1]

[1]: http://java.sun.com/javase/6/docs/api/java/lang/Class.html#forName(java.lang.String, логический, java.lang.ClassLoader)

1 голос
/ 28 марта 2010

Обычно вы используете ClassLoader как URLClassLoader для динамической загрузки классов во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...