相关疑难解决方法(0)

如何提高Field.set的性能(使用MethodHandles进行perhap)?

我正在写一些调用的代码Field.setField.get数千次.显然,由于反射,这是非常缓慢的.

我想看看我是否可以MethodHandle在Java7中提高性能.到目前为止,这就是我所拥有的:

而不是field.set(pojo, value),我正在做:

private static final Map<Field, MethodHandle> setHandles = new HashMap<>();

MethodHandle mh = setHandles.get(field);
if (mh == null) {
    mh = lookup.unreflectSetter(field);
    setHandles.put(field, mh);
}
mh.invoke(pojo, value);
Run Code Online (Sandbox Code Playgroud)

但是,这似乎没有比使用反射的Field.set调用更好.我在这里做错了吗?

我读到使用invokeExact可能会更快,但当我尝试使用它时,我得到了一个java.lang.invoke.WrongMethodTypeException

有没有人成功地优化了对Field.set或Field.get的重复调用?

java reflection performance field methodhandle

38
推荐指数
4
解决办法
6262
查看次数

通过反射调用Java中的getter:重复调用它的最快方法是什么(性能和可伸缩性)?

给定一个类Foo和一个属性bar,我在编译时都不知道,我需要多次重复调用getter Foo.getBar().

假设我有:

Method barGetterMethod = ...; // Don't worry how I got this
Run Code Online (Sandbox Code Playgroud)

我需要做这样的事情:

for (Object foo : fooList) { // 1000000000 elements in fooList
    Object bar = barGetterMethod.invoke(foo);
    ...
}
Run Code Online (Sandbox Code Playgroud)

与没有反射调用它相比,上面的实现仍然很慢.有更快的方法吗?

用Java反射调用getter的最快方法是什么?

java reflection

15
推荐指数
2
解决办法
8808
查看次数

标签 统计

java ×2

reflection ×2

field ×1

methodhandle ×1

performance ×1