【问题标题】:Alternatives to Class.getConstructor [for performance reasons]Class.getConstructor 的替代品[出于性能原因]
【发布时间】:2021-05-07 05:08:28
【问题描述】:

我正在尝试动态加载大约 10,000 个类,并且代码如下所示:

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

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

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

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

【问题讨论】:

  • 你可以试试 MethodHandles。

标签: java performance class reflection getconstructor


【解决方案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);

【讨论】:

  • invokeExact 将失败,因为 MethodHandle 的确切类型具有类的返回类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
相关资源
最近更新 更多