我正在尝试动态加载10,000个类,并有如下代码:
Class<?> c = getClass().getClassLoader().loadClass(className);
Constructor<?> constr = c.getConstructor(String.class);
constr.newInstance(myString);在分析方面,我注意到大部分时间都花在getConstructor调用上,这似乎平均占用了15 is,显然乘以10k之和。
有关于交替编写这个以加快java反射的建议吗?
附注:不幸的是,这些类必须动态加载(否则我根本不会使用反射)。
发布于 2021-02-03 01:24:22
据推测,它正在初始化所需费用的类。可以通过将.loadClass(className)更改为.loadClass(className, true)来检查这一点。如果它们是生成的类,那么也许您可以更改一些东西,例如,用公共代码替换静态字段上的大型文字数组,以便从字符串文本中提取数据。
编辑:刚刚检查,该标志正在解析(链接)。Class.forName(className, true, loader)初始化?乱七八糟。
如果您想尝试方法句柄,代码将按照以下几个方面来查看:
MethodType methodType = MethodType.methodType(
Void.TYPE, String.class
);
MethodHandles.Lookup lookup = MethodHandles.publicLookup();
... for each class ...
lookup.findConstructor(c, methodType).invokeExact(myString);https://stackoverflow.com/questions/66019549
复制相似问题