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

淘宝客怎么做自己的网站建网站英语怎么说

淘宝客怎么做自己的网站,建网站英语怎么说,重庆工程信息网官网首页,wordpress 324我之前推送过Java代码的编译与反编译#xff0c;其中简单的介绍了Java编译与反编译相关的知识#xff0c;最近给GitChat写《深入分析Java语法糖》的时候#xff0c;又用到了很多反编译相关的知识#xff0c;遂发现哪篇文章已有些过时。于是#xff0c;这篇文章就这样呈现在…我之前推送过Java代码的编译与反编译其中简单的介绍了Java编译与反编译相关的知识最近给GitChat写《深入分析Java语法糖》的时候又用到了很多反编译相关的知识遂发现哪篇文章已有些过时。于是这篇文章就这样呈现在你的面前了~编程语言在介绍编译和反编译之前我们先来简单介绍下编程语言(Programming Language)。编程语言(Programming Language)分为低级语言(Low-level Language)和高级语言(High-level Language)。机器语言(Machine Language)和汇编语言(Assembly Language)属于低级语言直接用计算机指令编写程序。而C、C、Java、Python等属于高级语言用语句(Statement)编写程序语句是计算机指令的抽象表示。举个例子同样一个语句用C语言、汇编语言和机器语言分别表示如下计算机只能对数字做运算符号、声音、图像在计算机内部都要用数字表示指令也不例外上表中的机器语言完全由十六进制数字组成。最早的程序员都是直接用机器语言编程但是很麻烦需要查大量的表格来确定每个数字表示什么意思编写出来的程序很不直观而且容易出错于是有了汇编语言把机器语言中一组一组的数字用助记符(Mnemonic)表示直接用这些助记符写出汇编程序然后让汇编器(Assembler)去查表把助记符替换成数字也就把汇编语言翻译成了机器语言。但是汇编语言用起来同样比较复杂后面就衍生出了Java、C、C等高级语言。什么是编译上面提到语言有两种一种低级语言一种高级语言。可以这样简单的理解低级语言是计算机认识的语言、高级语言是程序员认识的语言。那么如何从高级语言转换成低级语言呢这个过程其实就是编译。从上面的例子还可以看出C语言的语句和低级语言的指令之间不是简单的一一对应关系一条ab1;语句要翻译成三条汇编或机器指令这个过程称为编译(Compile)由编译器(Compiler)来完成显然编译器的功能比汇编器要复杂得多。用C语言编写的程序必须经过编译转成机器指令才能被计算机执行编译需要花一些时间这是用高级语言编程的一个缺点然而更多的是优点。首先用C语言编程更容易写出来的代码更紧凑可读性更强出了错也更容易改正。将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序翻译为计算机能解读、运行的低阶机器语言的程序的过程就是编译。负责这一过程的处理的工具叫做编译器现在我们知道了什么是编译也知道了什么是编译器。不同的语言都有自己的编译器Java语言中负责编译的编译器是一个命令javacjavac是收录于JDK中的Java语言编译器。该工具可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。当我们写完一个HelloWorld.java文件后我们可以使用javac HelloWorld.java命令来生成HelloWorld.class文件这个class类型的文件是JVM可以识别的文件。通常我们认为这个过程叫做Java语言的编译。其实class文件仍然不是机器能够识别的语言因为机器只能识别机器语言还需要JVM再将这种class文件类型字节码转换成机器可以识别的机器语言。什么是反编译反编译的过程与编译刚好相反就是将已编译好的编程语言还原到未编译的状态也就是找出程序语言的源代码。就是将机器看得懂的语言转换成程序员可以看得懂的语言。Java语言中的反编译一般指将class文件转换成java文件。有了反编译工具我们可以做很多事情最主要的功能就是有了反编译工具我们就能读得懂Java编译器生成的字节码。Java反编译工具本文主要介绍3个Java的反编译工具javap、jad和CFRjavapjavap是jdk自带的一个工具可以对代码反编译也可以查看java编译器生成的字节码。javap和其他两个反编译工具最大的区别是他生成的文件并不是java文件也不像其他两个工具生成代码那样更容易理解。拿一段简单的代码举例如我们想分析Java 7中的switch是如何支持String的我们先有以下可以编译通过的源代码public class switchDemoString { public static void main(String[] args) { String str world; switch (str) { case hello: System.out.println(hello); break; case world: System.out.println(world); break; default: break; } }}执行以下两个命令javac switchDemoString.javajavap -c switchDemoString.class生成代码如下public class com.hollis.suguar.switchDemoString { public com.hollis.suguar.switchDemoString(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object.:()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #2 // String world 2: astore_1 3: aload_1 4: astore_2 5: iconst_m1 6: istore_3 7: aload_2 8: invokevirtual #3 // Method java/lang/String.hashCode:()I 11: lookupswitch { // 2 99162322: 36 113318802: 50 default: 61 } 36: aload_2 37: ldc #4 // String hello 39: invokevirtual #5 // Method java/lang/String.equals:(Ljava/lang/Object;)Z 42: ifeq 61 45: iconst_0 46: istore_3 47: goto 61 50: aload_2 51: ldc #2 // String world 53: invokevirtual #5 // Method java/lang/String.equals:(Ljava/lang/Object;)Z 56: ifeq 61 59: iconst_1 60: istore_3 61: iload_3 62: lookupswitch { // 2 0: 88 1: 99 default: 110 } 88: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream; 91: ldc #4 // String hello 93: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 96: goto 110 99: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream; 102: ldc #2 // String world 104: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 107: goto 110 110: return}我个人的理解javap并没有将字节码反编译成java文件而是生成了一种我们可以看得懂字节码。其实javap生成的文件仍然是字节码只是程序员可以稍微看得懂一些。如果你对字节码有所掌握还是可以看得懂以上的代码的。其实就是把String转成hashcode然后进行比较。个人认为一般情况下我们会用到javap命令的时候不多一般只有在真的需要看字节码的时候才会用到。但是字节码中间暴露的东西是最全的你肯定有机会用到比如我在分析synchronized的原理的时候就有是用到javap。通过javap生成的字节码我发现synchronized底层依赖了ACC_SYNCHRONIZED标记和monitorenter、monitorexit两个指令来实现同步。jadjad是一个比较不错的反编译工具只要下载一个执行工具就可以实现对class文件的反编译了。还是上面的源代码使用jad反编译后内容如下命令jad switchDemoString.classpublic class switchDemoString{ public switchDemoString() { } public static void main(String args[]) { String str world; String s; switch((s str).hashCode()) { default: break; case 99162322: if(s.equals(hello)) System.out.println(hello); break; case 113318802: if(s.equals(world)) System.out.println(world); break; } }}看这个代码你肯定看的懂因为这不就是标准的java的源代码么。这个就很清楚的可以看到原来字符串的switch是通过equals()和hashCode()方法来实现的。但是jad已经很久不更新了在对Java7生成的字节码进行反编译时偶尔会出现不支持的问题在对Java 8的lambda表达式反编译时就彻底失败比如会直接CRFjad很好用但是无奈的是很久没更新了所以只能用一款新的工具替代他CFR是一个不错的选择相比jad来说他的语法可能会稍微复杂一些但是好在他可以work。如我们使用cfr对刚刚的代码进行反编译。执行一下命令java -jar cfr_0_125.jar switchDemoString.class --decodestringswitch false得到以下代码public class switchDemoString { public static void main(String[] arrstring) { String string; String string2 string world; int n -1; switch (string2.hashCode()) { case 99162322: { if (!string2.equals(hello)) break; n 0; break; } case 113318802: { if (!string2.equals(world)) break; n 1; } } switch (n) { case 0: { System.out.println(hello); break; } case 1: { System.out.println(world); break; } } }}通过这段代码也能得到字符串的switch是通过equals()和hashCode()方法来实现的结论。相比Jad来说CFR有很多参数还是刚刚的代码如果我们使用以下命令输出结果就会不同java -jar cfr_0_125.jar switchDemoString.classpublic class switchDemoString { public static void main(String[] arrstring) { String string; switch (string world) { case hello: { System.out.println(hello); break; } case world: { System.out.println(world); break; } } }}所以--decodestringswitch表示对于switch支持string的细节进行解码。类似的还有--decodeenumswitch、--decodefinally、--decodelambdas等。在我的关于语法糖的文章中我使用--decodelambdas对lambda表达式警进行了反编译。 源码public static void main(String... args) { List strList ImmutableList.of strList.forEach( s - { System.out.println(s); } );java -jar cfr_0_125.jar lambdaDemo.class --decodelambdas false反编译后代码public static /* varargs */ void main(String ... args) { ImmutableList strList ImmutableList.of((Object)Hollis
http://www.pierceye.com/news/195097/

相关文章:

  • 淘宝网站框架项目管理软件下载
  • 网站建设课程内容如何优化关键词
  • 龙口网站建设公司电子商务网站建设 课件
  • 权威做网站的公司网站织梦程序改成wordpress
  • 用cms建网站容易吗平面设计网课平台哪个好
  • 网站设计怎么做好什么视频直播网站做挣钱
  • 西安 网站开发 招聘app开发难吗
  • 富阳网站建设 优帮云邯郸市商标设计品牌策划公司
  • 整站优化费用中国网新重庆
  • 找别人做网站wordpress怎么更改栏目权限
  • 珠海市建设工程质量监督检测站网站在小网站上做点击广告
  • 网站拉圈圈接口怎么做传媒网站设计
  • 淘宝客做的最好的网站盐山建网站
  • 西城企业网站建设深圳设计网站多少钱
  • 电子商务网站建设a卷网站建设厘金手指排名二一
  • 网站空间便宜网站的信息管理建设的必要性
  • 校级特色专业建设网站博达站群网站建设教程
  • 有没有做任务的网站吗网站首页开发
  • 公司名字变了网站备案济南网站建设公司哪个好点呢
  • 图书馆网站建设的规章制度企业免费招聘网站
  • 效果图网站大全系统优化的例子
  • 京东的网站建设介绍网站开发要源码多少钱
  • 东莞网站制作公司报价企业定制
  • 创同盟做网站生成拼贴的网站
  • 网站备案号查电话号码商场网站开发
  • 手机网站建站教育模板下载泰州公司注册
  • 如何做商业网站推广西安市城乡建设管理局网站的公示栏
  • 上海做兼职哪个网站腾讯企业邮箱域名是什么
  • 霸州网站制作棋牌网站建设源码
  • 茶叶网站制作模板网页设计在安阳工资多少