JDK新特性2.pptVIP

  • 3
  • 0
  • 约2.18万字
  • 约 61页
  • 2017-05-28 发布于上海
  • 举报
JDK新特性2ppt课件

* * * * * * * * * * * * * * * * * * * * * * * * * * public void invokerTransform() throws Throwable { MethodType typeInvoker = MethodType.methodType(String.class, String.class, int.class, int.class); MethodHandle invoker = MethodHandles.exactInvoker(typeInvoker); MethodHandles.Lookup lookup = MethodHandles.lookup(); MethodHandle mhUpperCase = lookup.findVirtual(String.class, toUpperCase, MethodType.methodType(String.class)); invoker = MethodHandles.filterReturnValue(invoker, mhUpperCase); MethodType typefind = MethodType.methodType(String.class, int.class, int.class); MethodHandle mh1 = lookup.findVirtual(String.class, substring, typefind); String result = (String) invoker.invoke(mh1, Hello, 1, 4); System.out.println(result); } 方法句柄也具备动态实现一个接口的能力。这是通过java.lang.invoke.MethodHandleProxies类中的静态方法asInterfaceInstance来实现的。 不过通过方法句柄实现接口所受的限制比较多。首先该接口必须是公开的,该接口只能包含一个名词唯一的方法。这样的限制是因为只有一个方法句柄用来处理方法调用。 调用asInterfaceInstance方法时需要两个参数,第一个参数是要实现的接口类,第二个参数是处理方法调用逻辑的方法句柄对象。方法的返回值是一个实现了该接口的对象。 当调用接口方法时,这个调用会被代理给方法句柄来完成。方法句柄的返回值会作为接口调用的返回值。接口的方法类型和方法句柄的类型必须是兼容的,否则会抛出异常。 public void doSomething() { System.out.println(Ljinfeng); } public void userMethodHandleProxy() throws Throwable { MethodHandles.Lookup lookup = MethodHandles.lookup(); MethodHandle mh = lookup.findVirtual( UseMethodHandleImplementInterface.class, doSomething, MethodType.methodType(void.class)); mh = mh.bindTo(this); Runnable runnable = MethodHandleProxies.asInterfaceInstance( Runnable.class, mh); new Thread(runnable).start(); } 在通过查找已有类中的方法得到方法句柄的时候,要受限于java语言中已有的方法控制权限。 方法句柄于反射API在访问控制权限上的一个重要区别在于,在每次调用反射API的Method类的invoke方法的时候都需要检查方法控制权限,而方法句柄只在查找的时候进行检查。只要在查找过程中不出现问题,方法句柄在使用过程中就不会出现与访问控制权限相关的问题。这种实现也使方法句柄在调用时的性能要优于Method类 package com.methodhandle; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; public class AccessControlAuthority { private void privateMethod() { System.out.println(PRIVATE); } public MethodHandle accessControl() throws Throwable { M

文档评论(0)

1亿VIP精品文档

相关文档