电子商务平台网站推广,郑州专业做淘宝网站,惠州淡水网站建设,在QQ上做cpa网站说是恶意的小编典典您可以使用MethodHandle。其Javadoc写道#xff1a;使用Lookup API中的工厂方法#xff0c;可以将Core ReflectionAPI对象表示的任何类成员转换为行为等效的方法句柄。例如#xff0c;可以使用Lookup.unreflect将反射方法转换为方法句柄。生成的方法句柄通常提供对底…小编典典您可以使用MethodHandle。其Javadoc写道使用Lookup API中的工厂方法可以将Core ReflectionAPI对象表示的任何类成员转换为行为等效的方法句柄。例如可以使用Lookup.unreflect将反射方法转换为方法句柄。生成的方法句柄通常提供对底层类成员的更直接和有效的访问。虽然这将减少开销但如果使用常规(非反射)字节代码指令进行调用则方法句柄仍会阻止JVM可以采用某些优化(此类方法内联)。这种优化是否有益取决于您使用该方法的方式(如果该代码路径始终调用同一方法则内联可以提供帮助(如果每次都是不同的方法则可能不会)。以下微基准可以使您大致了解反射方法句柄和直接调用的相对性能package tools.bench;import java.lang.invoke.MethodHandle;import java.lang.invoke.MethodHandles;import java.lang.reflect.Method;import java.math.BigDecimal;public abstract class Bench {final String name;public Bench(String name) {this.name name;}abstract int run(int iterations) throws Throwable;private BigDecimal time() {try {int nextI 1;int i;long duration;do {i nextI;long start System.nanoTime();run(i);duration System.nanoTime() - start;nextI (i 1) | 1;} while (duration 100000000 nextI 0);return new BigDecimal((duration) * 1000 / i).movePointLeft(3);} catch (Throwable e) {throw new RuntimeException(e);}}Overridepublic String toString() {return name \t time() ns;}static class C {public Integer foo() {return 1;}}static final MethodHandle sfmh;static {try {Method m C.class.getMethod(foo);sfmh MethodHandles.lookup().unreflect(m);} catch (Exception e) {throw new RuntimeException(e);}}public static void main(String[] args) throws Exception {final C invocationTarget new C();final Method m C.class.getMethod(foo);final Method am C.class.getMethod(foo);am.setAccessible(true);final MethodHandle mh sfmh;Bench[] marks {new Bench(reflective invocation (without setAccessible)) {Override int run(int iterations) throws Throwable {int x 0;for (int i 0; i iterations; i) {x (Integer) m.invoke(invocationTarget);}return x;}},new Bench(reflective invocation (with setAccessible)) {Override int run(int iterations) throws Throwable {int x 0;for (int i 0; i iterations; i) {x (Integer) am.invoke(invocationTarget);}return x;}},new Bench(methodhandle invocation) {Override int run(int iterations) throws Throwable {int x 0;for (int i 0; i iterations; i) {x (Integer) mh.invokeExact(invocationTarget);}return x;}},new Bench(static final methodhandle invocation) {Override int run(int iterations) throws Throwable {int x 0;for (int i 0; i iterations; i) {x (Integer) sfmh.invokeExact(invocationTarget);}return x;}},new Bench(direct invocation) {Override int run(int iterations) throws Throwable {int x 0;for (int i 0; i iterations; i) {x invocationTarget.foo();}return x;}},};for (Bench bm : marks) {System.out.println(bm);}}}在我有些过时的笔记本上java version 1.7.0_02Java(TM) SE Runtime Environment (build 1.7.0_02-b13)Java HotSpot(TM) Client VM (build 22.0-b10, mixed mode, sharing)打印reflective invocation (without setAccessible) 568.506 nsreflective invocation (with setAccessible) 42.377 nsmethodhandle invocation 27.461 nsstatic final methodhandle invocation 9.402 nsdirect invocation 9.363 ns更新正如Irreputable所指出的那样服务器VM具有一些不同的性能特征因此仅当您可以将MethodHandle放在静态final字段中时 在 服务器VM中使用MethodHandle才有帮助在这种情况下VM可以内联调用reflective invocation (without setAccessible) 9.736 nsreflective invocation (with setAccessible) 7.113 nsmethodhandle invocation 26.319 nsstatic final methodhandle invocation 0.045 nsdirect invocation 0.044 ns我建议您衡量您的特定用例。2020-09-18