在运行时在java中创建类的实例

时间:2010-03-28 15:35:18

标签: java class runtime

在我的程序中,我动态生成类,但是当我尝试时:

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 个答案:

答案 0 :(得分:2)

听起来像是一个类路径问题。确保有问题的类(或包含它的jar)已编译并位于类路径中。

“动态生成类”究竟是什么意思?如果为类生成java源文件,则需要先将其编译为类文件,然后类加载器才能将其拾取。也许Eclipse会在第二轮中做到这一点,这就是为什么它正在发挥作用。

答案 1 :(得分:1)

您通常会使用ClassLoader之类URLClassLoader来在运行时动态加载类。

答案 2 :(得分:1)

使用Class.forName()的三个参数形式,它要求您指定ClassLoader。 [Java API链接] [1]

[1]:http://java.sun.com/javase/6/docs/api/java/lang/Class.html#forName(java.lang.String,boolean,java.lang.ClassLoader)

答案 3 :(得分:1)

阅读docs on URLClassLoader任何以“/”结尾的网址都被视为引用目录。

此外,您可能应该使用'/'作为分隔符而不是\\

附录:

好吧,如果在指定为URL的目录中有实际编译的Java类,那么您的代码对我来说非常合适。但是当你说

  

在我的程序中,我生成了类   动态

你直接生成Java源代码还是字节码?如果是源代码,您是否也从应用程序编译它?