这里的情况很奇怪。我需要多次调用相同的类实例方法(1000/秒范围),但无法导入或构建所需的库。我试图在我的 JEE 项目中调用一个方法,该方法使用应用程序服务器提供的库中的一个类。JEE 项目仍然需要在其他应用程序服务器上运行,因此我不能简单地针对该库进行构建。反思是我认为的唯一解决方案。
当速度如此之快时,使用反射的执行时间比直接调用慢几个数量级。
经过一番研究,我发现了 static final MethodHandles:
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
public class Test {
static final MethodHandle sfmh;
static {
MethodHandle mh = null;
try {
final Class<?> clazz = Class.forName("com.me.lib");
Method m = clazz.getMethod("MyMethod");
mh = MethodHandles.lookup().unreflect(m);
} catch (Throwable e) {
mh = null;
}
sfmh = mh;
}
public static void main(String[] args) throws Throwable {
int i = 0;
System.out.println("starting");
long start = System.currentTimeMillis();
for(i = 0; i < 1000000000; i++) {
sfmh.invokeExact();
}
long total = System.currentTimeMillis() - start;
System.out.println("Time: " + total + " milliseconds");
}
}
效果很好,让我得到了可接受的速度结果(慢 2-4 倍而不是慢 200 倍)。这个完美的解决方案似乎存在问题——我需要它在 Java 6 上运行(嘘,嘶嘶声,这是一个要求)
针对 1.6 进行编译时,我得到:
低于 1.7 的源级别不允许调用多态方法
在线上
sfmh.invokeExact();
是否有任何解决方案可以利用与 1.6 一起使用的 MethodHandle 的概念?