gpt4 book ai didi

Java 类加载运行速度极慢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:01:22 25 4
gpt4 key购买 nike

我正在尝试动态加载 java .class 文件并通过反射调用它。

我有一个名为 Foo 的类;它有一个空的构造函数和一个名为 doit() 的方法,该方法接受一个字符串参数并返回一个字符串。它还反转字符串。

这是我的代码:

    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 毫秒左右。

我使用的是带 JRE 1.6.0_13 的 Eclipse,我运行的是 Windows Vista。

我在这里做错了什么?

谢谢。

编辑: 我分析了代码,它的所有时间都用于第三行 (loadClass())。其他一切都会立即发生。

编辑:我把代码放在一个循环中; slow 函数以某种方式得到优化,仅在第一个循环中花费 30 秒。

编辑:我找到了解决方案。

代替:

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

我把它改成了:

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

现在它完美运行了。我不知道它为什么有效,但我不明白我(和其他 5 个人)怎么会错过它。现在我觉得很傻..

最佳答案

供您引用:也许对你来说有点晚了,但我偶然发现了同样的问题并找到了这篇文章。

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

我尝试了以下方法:

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

这(几乎)与您的单斜线解决方案一样快。

关于Java 类加载运行速度极慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/896255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com