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 /");
这(几乎)与你的单一斜杠解决方案一样快.
在30秒时,您应该能够"分析"您的代码并查看问题的确切位置(在加载类时?在创建实例时?查找方法?等等?)
由于它需要30秒(而不是更小,大约10ms左右),您可以System.out.println(new Date());在代码的每一行之间使用.
我怀疑你会发现它是loader.loadClass(String)花了这么长时间 - 我怀疑你会发现你有一个很长的类路径,或者包含某种网络资源的类路径.
| 归档时间: |
|
| 查看次数: |
8294 次 |
| 最近记录: |