我正在尝试动态加载
java .class文件并通过反射调用它.
我有一个名为Foo的课程;它有一个空的构造函数,并有一个名为doit()的方法,它接受一个String参数并返回一个String.它也会反转字符串.
这是我的代码:
URL url = new URL("file://C:/jtest/");
URLClassLoader loader = new URLClassLoader(new URL[]{url});
Class> cl = loader.loadClass("Foo");
Constructor> cons = cl.getConstructor((Class[])null);
Object ins = cons.newInstance(new Object[]{});
Method meth = cl.getDeclaredMethod("doit", String.class);
Object ret = meth.invoke(ins, new Object[]{"!dlroW olleH"});
System.out.println((String)ret);
正如预期的那样,它打印出“Hello World!”.但是,完成大约需要30秒.我知道反射很慢,但我希望它是10毫秒或者其他东西.
我正在使用Eclipse和JRE 1.6.0_13,而我正在运行Windows Vista.
我在这做错了什么?
谢谢.
编辑:我已经分析了代码,并且它的所有时间都在第三行(loadClass())中使用.其他一切都会立即发生.
编辑:我把代码放在一个循环中;慢速函数以某种方式得到优化,仅在第一个循环上需要30秒.
编辑:我找到了解决方案.
代替:
URL url = new URL(“file:// C:/ jtest /”);
我改成了:
URL url = new URL(“file:/ C:/ jtest /”);
现在它完美无缺.我不知道它为什么会起作用,但我不知道我(以及其他5个人)是如何错过的.现在我觉得愚蠢..