Java类加载运行速度极慢?

Luc*_*cky 7 java reflection performance

我正在尝试动态加载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);
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它打印出"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个人)是如何错过的.现在我觉得愚蠢..

小智 6

您的信息:对您来说可能有点晚了,但我偶然发现了同样的问题并找到了这篇文章.

看起来//正在强制进行远程搜索,如果使用-verbose:class运行,则会加载UnknownHostException,因此必须在类加载期间在内部抛出此异常.

我尝试了以下方法:

URL url = new URL("file:// localhost/C:/ jtest /");

这(几乎)与你的单一斜杠解决方案一样快.


Eri*_*ler 5

检查您的默认类路径.也许它指的是不可用的网络共享或类似的东西.


Jar*_*red 5

在30秒时,您应该能够"分析"您的代码并查看问题的确切位置(在加载类时?在创建实例时?查找方法?等等?)

由于它需要30秒(而不是更小,大约10ms左右),您可以System.out.println(new Date());在代码的每一行之间使用.

我怀疑你会发现它是loader.loadClass(String)花了这么长时间 - 我怀疑你会发现你有一个很长的类路径,或者包含某种网络资源的类路径.

  • @unknown:在这种情况下(如果你解决了问题)你应该发布你知道正确的答案并接受那个答案. (2认同)