当前位置: 首页 > news >正文

汕头网站制作公司免费网络短剧

汕头网站制作公司,免费网络短剧,做外贸公司网站怎么做,dw做网站首页长宽设置多少我当前的Java 7系列中的另一个博客条目。 这次#xff0c;它处理的是invokedynamic#xff0c;这是JVM上用于方法调用的新字节码指令。 invokedynamic指令允许在呼叫站点和呼叫接收者之间进行动态链接。 这意味着您可以将正在执行方法调用的类链接到在运行时正在接收调用的类… 我当前的Java 7系列中的另一个博客条目。 这次它处理的是invokedynamic这是JVM上用于方法调用的新字节码指令。 invokedynamic指令允许在呼叫站点和呼叫接收者之间进行动态链接。 这意味着您可以将正在执行方法调用的类链接到在运行时正在接收调用的类和方法。 所有其他用于方法调用的JVM字节码指令例如invokevirtual 都将目标类型信息硬连线到编译中即硬连线到类文件中。 让我们看一个例子。 Constant pool:#1 Class #2 // com/schlimm/bytecode/examples/BytecodeExamples...#42 Class #43 // java/lang/String...#65 Methodref #42.#66 // java/lang/String.length:()I#66 NameAndType #67:#68 // length:()I#67 Utf8 length#68 Utf8 ()I... {...public void virtualMethodCall();flags: ACC_PUBLICCode:stack1, locals1, args_size10: ldc #44 // String Hello2: invokevirtual #65 // Method java/lang/String.length:()I5: pop6: returnLineNumberTable:line 31: 0line 32: 6LocalVariableTable:Start Length Slot Name Signature0 7 0 this Lcom/schlimm/bytecode/examples/BytecodeExamples; } 上面的字节码片段显示了java.lang的invokevirtual方法调用。 第20行中的String- length 。它引用了contsant池表中的Item 65它是MethodRef条目请参见第6行。 常量池表中的项目42和66引用类和方法描述符条目。 如您所见invokevirtual调用的目标类型和方法已完全解析并硬连接到字节码中。 现在让我们回到invokedynamic 重要的是要注意不可能将Java代码编译为包含invokedynamic指令的字节码。 Java是静态类型的 。 这意味着Java在编译时执行类型检查。 因此在Java中有可能并且想要将方法调用接收者的所有类型信息硬连线到调用者类文件中。 调用方知道调用目标的类型名称如上面的示例所示。 另一方面使用invokedynamic可使JVM在运行时准确解析该类型信息。 只有动态语言例如JRuby或Rhino才需要也想要。 现在假设您要在动态键入的JVM上实现一种新语言。 我不建议您在JVM上发明另一种语言但是假设您应该并且假设您的新语言应被动态键入。 用您的新语言这意味着在运行时执行方法调用的调用方和接收方之间的链接。 由于Java 7这可以使用invokedynamic指令在字节码级别上实现。 因为无法使用Java编译器创建invokedynamic指令所以我将创建一个包含我自己的invokedynamic的类文件。 创建此类文件后我将使用普通的Java启动器运行该类文件的main方法。 没有编译器如何创建类文件 这可以通过使用字节码操作框架例如ASM或Javassist来实现 。 以下代码段显示了SimpleDynamicInvokerGenerator 该生成器可以生成一个类文件SimpleDynamicInvoker.class该文件包含invokedynamic指令。 public abstract class AbstractDynamicInvokerGenerator implements Opcodes {public byte[] dump(String dynamicInvokerClassName, String dynamicLinkageClassName, String bootstrapMethodName, String targetMethodDescriptor)throws Exception {ClassWriter cw new ClassWriter(0);FieldVisitor fv;MethodVisitor mv;AnnotationVisitor av0;cw.visit(V1_7, ACC_PUBLIC ACC_SUPER, dynamicInvokerClassName, null, java/lang/Object, null);{mv cw.visitMethod(ACC_PUBLIC, init, ()V, null, null);mv.visitCode();mv.visitVarInsn(ALOAD, 0);mv.visitMethodInsn(INVOKESPECIAL, java/lang/Object, init, ()V);mv.visitInsn(RETURN);mv.visitMaxs(1, 1);mv.visitEnd();}{mv cw.visitMethod(ACC_PUBLIC ACC_STATIC, main, ([Ljava/lang/String;)V, null, null);mv.visitCode();MethodType mt MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,MethodType.class);Handle bootstrap new Handle(Opcodes.H_INVOKESTATIC, dynamicLinkageClassName, bootstrapMethodName,mt.toMethodDescriptorString());int maxStackSize addMethodParameters(mv);mv.visitInvokeDynamicInsn(runCalculation, targetMethodDescriptor, bootstrap);mv.visitInsn(RETURN);mv.visitMaxs(maxStackSize, 1);mv.visitEnd();}cw.visitEnd();return cw.toByteArray();}protected abstract int addMethodParameters(MethodVisitor mv);}public class SimpleDynamicInvokerGenerator extends AbstractDynamicInvokerGenerator {Overrideprotected int addMethodParameters(MethodVisitor mv) {return 0;}public static void main(String[] args) throws IOException, Exception {String dynamicInvokerClassName com/schlimm/bytecode/SimpleDynamicInvoker;FileOutputStream fos new FileOutputStream(new File(target/classes/ dynamicInvokerClassName .class));fos.write(new SimpleDynamicInvokerGenerator().dump(dynamicInvokerClassName, com/schlimm/bytecode/invokedynamic/linkageclasses/SimpleDynamicLinkageExample, bootstrapDynamic, ()V));}} 我在这里使用ASM 一种通用的Java字节码操纵和分析框架来完成创建正确的类文件格式的工作。 在第30行中 visitInvokeDynamicInsn创建了invokedynamic指令。 生成一个进行invokedynamic调用的类只是故事的一半。 您还需要一些将动态调用站点链接到实际目标的代码这是invokedynamic的真正目的。 这是一个例子。 public class SimpleDynamicLinkageExample {private static MethodHandle sayHello;private static void sayHello() {System.out.println(There we go!);}public static CallSite bootstrapDynamic(MethodHandles.Lookup caller, String name, MethodType type) throws NoSuchMethodException, IllegalAccessException {MethodHandles.Lookup lookup MethodHandles.lookup();Class thisClass lookup.lookupClass(); // (who am I?)sayHello lookup.findStatic(thisClass, sayHello, MethodType.methodType(void.class));return new ConstantCallSite(sayHello.asType(type));}} 第9-14行中的bootstrap方法选择动态调用的实际目标。 在我们的例子中目标是sayHello 方法。 要了解bootstrap方法如何链接到invokedynamic指令我们需要深入研究使用SimpleDynamicInvokerGenerator生成的SimpleDynamicInvoker字节码。 E:\dev_home\repositories\git\playground\bytecode-playground\target\classes\com\schlimm\bytecodejavap -c -verbose SimpleDynamicInvoker.classClassfile /E:/dev_home/repositories/git/playground/bytecode-playground/target/classes/com/schlimm/bytecode/SimpleDynamicInvoker.classLast modified 30.01.2012; size 512 bytesMD5 checksum 401a0604146e2e95f9563e7d9f9d861b public class com.schlimm.bytecode.SimpleDynamicInvokerBootstrapMethods:0: #17 invokestatic com/schlimm/bytecode/invokedynamic/linkageclasses/SimpleDynamicLinkageExample.bootstrapDynamic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;Method arguments:minor version: 0major version: 51flags: ACC_PUBLIC, ACC_SUPER Constant pool:#1 Utf8 com/schlimm/bytecode/SimpleDynamicInvoker#2 Class #1 // com/schlimm/bytecode/SimpleDynamicInvoker#3 Utf8 java/lang/Object#4 Class #3 // java/lang/Object#5 Utf8 init#6 Utf8 ()V#7 NameAndType #5:#6 // init:()V#8 Methodref #4.#7 // java/lang/Object.init:()V#9 Utf8 main#10 Utf8 ([Ljava/lang/String;)V#11 Utf8 com/schlimm/bytecode/invokedynamic/linkageclasses/SimpleDynamicLinkageExample#12 Class #11 // com/schlimm/bytecode/invokedynamic/linkageclasses/SimpleDynamicLinkageExample#13 Utf8 bootstrapDynamic#14 Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;#15 NameAndType #13:#14 // bootstrapDynamic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;#16 Methodref #12.#15 // com/schlimm/bytecode/invokedynamic/linkageclasses/SimpleDynamicLinkageExample.bootstrapDynamic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;#17 MethodHandle #6:#16 // invokestatic com/schlimm/bytecode/invokedynamic/linkageclasses/SimpleDynamicLinkageExample.bootstrapDynamic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;#18 Utf8 runCalculation#19 NameAndType #18:#6 // runCalculation:()V#20 InvokeDynamic #0:#19 // #0:runCalculation:()V#21 Utf8 Code#22 Utf8 BootstrapMethods {public com.schlimm.bytecode.SimpleDynamicInvoker();flags: ACC_PUBLICCode:stack1, locals1, args_size10: aload_01: invokespecial #8 // Method java/lang/Object.init:()V4: returnpublic static void main(java.lang.String[]);flags: ACC_PUBLIC, ACC_STATICCode:stack0, locals1, args_size10: invokedynamic #20, 0 // InvokeDynamic #0:runCalculation:()V5: return } 在第49行中您可以看到invokedynamic指令。 动态方法的逻辑名称是runCalculation 这是一个虚拟名称。 您可以使用任何有意义的名称也可以使用“ ”之类的名称。 该指令引用了竞争池表中的第20项请参见第33行。 这又引用了BootstrapMethods属性中的索引0请参见第8行。 在这里您可以看到指向SimpleDynamicLinkageExample.bootstrapDynamic方法的链接该方法将invokedynamic指令链接到调用目标。 现在如果您使用java启动器调用SimpleDynamicInvoker 则将执行invokedynamic调用。 下面的序列图说明了使用Java启动器调用SimpleDynamicInvoker时发生的情况。 使用invokedynamic的runCalculation的第一次调用会发出对bootstrapDynamic方法的调用。 此方法在调用类SimpleDynamicInvoker和接收类 SimpleDynamicLinkageExample 之间进行动态链接。 bootstrap方法返回一个以接收类为目标的MethodHandle。 缓存此方法句柄以重复调用runCalculation方法。 这就是invokedynamic。 我在Git仓库中发布了一些更复杂的示例。 希望您在阅读不足时喜欢阅读本文 干杯尼克拉斯 参考 JCG合作伙伴提供的 “ Java 7一个完整​​的invokedynamic示例”   尼克拉斯。 http://docs.oracle.com/javase/7/docs/technotes/guides/vm/multiple-language-support.html http://asm.ow2.org/ http://java.sun.com/developer/technicalArticles/DynTypeLang/ http://asm.ow2.org/doc/tutorial-asm-2.0.html http://weblogs.java.net/blog/forax/archive/2011/01/07/calling-invokedynamic-java http://nerds-central.blogspot.com/2011/05/performing-dynamicinvoke-from-java-step.html 翻译自: https://www.javacodegeeks.com/2012/02/java-7-complete-invokedynamic-example.html
http://www.sadfv.cn/news/135966/

相关文章:

  • 河北提供网站制作公司电话怎么做同城商务网站
  • 佛山外贸网站建设价位商赢网站建设
  • 沧州市建设服务中心网站网站首页做30个关键词
  • 微信营销成功案例分享绵阳做网站优化
  • 网站虚拟主机免备案问答网站模板下载
  • 响应式网站跟一般网站的区别dedecms 购物网站
  • 如何禁止ip访问网站彬县网招聘
  • 电影网站做淘宝联盟长沙网络公司大全
  • 使用三剑客做网站劳务派遣做网站的好处
  • 网站管理后台文章排序wordpress 访客统计插件
  • 合肥专业网站优化价格俄语网站服务器
  • app开发好还是网站开发好开封旅游网站建设方案策划书
  • 深圳企业建设网站财务公司经营范围有哪些
  • 泰安网站建设制作服务小程序开发定制外包
  • 网站开发授权书网站备案 厦门
  • 南京商城网站建设摄影网站网页设计
  • 福州什么推广网站好跑腿小程序源码
  • 网站seo方法广州网络设计
  • 做网站设计的公司排名企业在哪里查询
  • 网页内嵌网站管理咨询公司名称
  • 崇明网站建设网站建设与维护方式
  • 蒙城做网站的公司网站开发有前途么
  • 福州有做网站引流的吗wordpress 商城站下载
  • 服务器网络石家庄seo全网营销
  • 学校网站建设方案策划书东莞哪家做网站比较好
  • 网站推广软件哪个好如何建一个微信公众号
  • 一个网站开发背景是什么网站做5级分销合法吗
  • 北京商城网站建设费用南京网站开发公司排名
  • 商丘住房和城乡建设厅网站网站都有备案号吗
  • 博宇娱乐网站建设公司网络安全管理制度和应急工作预案