2

我正在尝试动态加载〜10,000个类并具有如下代码:

Class<?> c = getClass().getClassLoader().loadClass(className);
Constructor<?> constr = c.getConstructor(String.class);
constr.newInstance(myString);

在分析时,我注意到大部分时间都花在了getConstructor调用上,这似乎平均花费了 15 毫秒左右,显然乘以 10k 加起来。

关于编写此代码以加快 Java 反射速度的任何建议?

ps 不幸的是,这些类必须动态加载(否则我根本不会使用反射)

4

1 回答 1

1

大概是初始化成本的类。这可以通过更改.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);
于 2021-02-03T01:24:22.853 回答