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

给视频做特效的网站/网站运营及推广方案

给视频做特效的网站,网站运营及推广方案,科技成果,开工作室需要什么条件2019独角兽企业重金招聘Python工程师标准>>> 一、简述 用于生成和转换编译后的java类,动态生成java 字节码,生成class文件。 二、使用描述 编译后的java类包含以下几部分:  一个用于描述修饰符(public或者private&am…

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、简述

用于生成和转换编译后的java类,动态生成java 字节码,生成class文件。

二、使用描述

编译后的java类包含以下几部分:
 一个用于描述修饰符(public或者private),类名,父类名称,所实现的接口名称以及类注解的段。
 一个用于描述类中字段信息的段。每个这样的段中都描述了字段的修饰符,名称,类型以及与该字段相关的注解。
 一个用于描述方法和构造方法的段。每个段描述了方法的名称,返回值,参数类型以及方法的注解。同时也包含了方法编译后的字节码序列。

在源代码和编译后的代码之间,还是存在一些不同:
 一个编译后的java类仅仅只描述一个类信息,但是一个java源文件可以包含几个java类。例如,一个源文件可以定义一个包含内部类的java类,而编译后将会成为两个类文件,其中一个是主要的java类,另外一个是内部类。在主要的类中包含了指向内部类的引用,同时在主要的java类的方法中定义的内部类也会包含一个指向该java方法的引用。
 一个编译后的java类不包含注释,当然,可以包含与类、字段、方法或者代码相关的属性,而这些属性可以用来关联一些额外的信息。在java 5中引入了注解以后,这些注解也可以实现同样的目的,因此,这些属性就变得不那么重要了。
 一个编译后的java类不包含package和import段,因此,在编译后的类中,所有的类型名称都必须使用全路径。

 

类的具体结构请参看java虚拟机规范第四段

76656d17daa4f1fbdea04b6711e55055a54.jpg

编译后的java类整体结构(*表示0或者更多)

2.1.2内部名称
在很多情况下,一个类型限于一个java类或者结构表示的类型,例如,一个类的父类,一个类所实现的接口,一个方法所抛出的异常(不可能是基本类型)或者数组,这些都是类或者接口类型。这些类型在编译后的类中以内部名称表示。一个类的内部名称就是这个类的全路径名称,将包名中的点号替换为/。例如,String的内部名称为java/lang/String。

2.1.3类型描述符
内部名称仅用作一个类或者接口的类型,所有其他的,如字段类型,java基本类型都是以类型描述符来表示的,见图2.2
 类型描述符:

50d035aad1a8b76a5979b654846e4e1cf46.jpg
基本类型的描述符:Z表示boolean,C表示char,B表示byte,I表示int,F表示float,J表示long,D表示double。一个类的描述符就是这个类的内部名称,在前面加上一个L,在后面加上一个分号即可。例如,String的类型描述符就是Ljava/lang/String.最后,一个数组的类型描述符就是一个中括号[后面跟上数组元素的类型描述符。

2.1.4方法描述符
一个方法描述符就是一个包含参数类型的描述符,以及方法返回类型描述符的字符串。一个方法描述符以一个左括号开始,然后跟上每个参数的描述符,然后是一个右括号,最后就是返回值的类型描述符,如果一个方法的返回值是void,那么返回值的类型描述符就是V(一个方法描述符不包含这个方法的名称以及参数的名称)。
方法描述符示例

3a12c3931199e8a9034a42ccd12b10c71cf.jpg
一旦你知道了类型描述符如何工作,那么理解方法描述符很容易。例如,(I)I描述了这样一个方法,它有一个int类型的参数,以及一个int返回值。图2.3给出了几个方法描述符的例子。

2.2接口和组件
2.2.1表现(Presentation)
生成和转换编译后的类的ASM API是基于ClassVisitor接口的(见图2.4)。在这个接口中的每一个方法都与类文件中有着相同名称的段相对应(见图2.1)。在访问类结构中简单的段时,是通过调用一个独立的方法来实现的,该方法的参数就是该段相关的内容,该方法的返回值为void。对长度任意并且较复杂的段进行访问时,是通过一个初始化方法返回一个辅助的visitor接口来实现,例如visitAnnotation,visitField以及visitMethod,它们都返回与之对应的接口AnnotationVisitor,FieldVisitor以及MethodVisitor。
这些规则也同样适用于这些辅助接口。例如,在FieldVisitor接口中的每个方法,都与类文件结构中与该名称(Field)对应的子结构对应(见图2.5),并且visitAnnotation并会一个辅助的AnnotationVisitor接口,与ClassVisitor中的AnnotationVisitor相同。关于这些辅助接口的创建和使用,将在下一章节介绍,这一章主要限于那些简单的问题,使用ClassVisitor接口就可以解决的。
图2.4 ClassVisitor接口

4ba1d1cdbd18e38712b2d975f91d8dd3153.jpg
图2.5 FieldVisitor接口

5e55bf15fd0dfe9279d549c263161ceefb6.jpg
对ClassVisitor接口中方法的调用必须遵循下面文档定义的顺序,该文档定义在ClassVisitor
接口的Javadoc中。
visit visitSource? visitOuterClass? ( visitAnnotation | visitAttribute )*( visitInnerClass | visitField | visitMethod )*
visitEnd
这就意味着visit必须被第一个调用,然后调用visitSource方法,最多调用一次,再接着是visitOuterClass,然后再调用任意次数的visitAnnotation或者visitAttribute方法,接着可以调用任意次数的visitInnerClass,visitiField或者visitMethod,顺序不限,在最后,调用visitEnd方法。
在ClassVisitor接口的基础上,ASM提供了三个组件来生成和转换类:
 ClassReader 用来解析编译过的class的字节数组。然后,调用ClassVisitor实例的visitXxx方法,其中ClassVisitor实例作为ClassReader.accept方法的参数传递进去的。ClassReader可以被看做是一个事件产生者。
 ClassWriter是ClassVisitor接口的一个实现,用来以二进制方式构建编译后的类。它产生一个包含编译后的类的字节数组,可以通过它的toByteArray方法来或得。它可以被看做是一个事件消费者。
 ClassAdapter也是ClassVisitor接口的一个实现,它将对它的方法调用委托给另一个ClassVisitor。它可以被认为是一个事件过滤器。
接下来,将结合具体的例子来展示如何使用这些组件来生成和转换类。

 

转载于:https://my.oschina.net/u/2292306/blog/3005519

http://www.lbrq.cn/news/1572895.html

相关文章:

  • 做的比较好的法律实务培训网站/百度推广销售员好做吗
  • 网站需要多少钱/如何自建网站?
  • 正规网站建设团队是什么/网站seo关键词优化
  • 个人网页设计作品简约/广州排前三的seo公司
  • java 就是做网站的吗/上海网站推广广告
  • 网站换了服务器/网站优化塔山双喜
  • 网站图片加载 优化/品牌营销平台
  • 自己做企业网站/找谁做百度关键词排名
  • 排名优化网站/搜索引擎营销的主要方式有
  • 网站开发原始数据/强力搜索引擎
  • 手机网站 wap/宁波网站快速优化
  • 赣州网上立案网址/上海关键词优化的技巧
  • 北京网站开发公司哪家好/互联网营销师有什么用
  • 邵阳做网站哪家好/百度电话怎么转人工
  • ddns做网站/新浪博客seo
  • 电商网站开发的项目描述/建站为应用技术
  • 出售网站建设群/今日热榜
  • 自己切片做网站/seo营销工具
  • wordpress搜索页面怎么仿/搜索引擎优化概述
  • 网站建设费无形资产摊销/百度软件
  • WordPress5更改logo/seo排名优化联系13火星软件
  • 北京移动端网站建设/seo关键词排名优
  • 为什么要学电商网站建设/百度新闻头条新闻
  • 深圳市人民政府网站/google 浏览器
  • 我做网站了/日照seo优化
  • phpcms v9网站建设入门/网络设计
  • 海南房产/百度seo刷排名工具
  • 深圳优质网站建设案例/品牌营销策略有哪些
  • 怎么设置批发网站怎么做/2023年时政热点事件
  • 网站图片多大比较合适/互联网广告怎么做
  • 【Docker项目实战】使用Docker部署todo任务管理器
  • RabbitMQ面试精讲 Day 21:Spring AMQP核心组件详解
  • 升级Gradle版本后,安卓点击事件使用了SwitchCase的情况下,报错无法使用的解决方案
  • 机器学习处理文本数据
  • 农业智慧大屏系统 - Flask + Vue实现
  • Python初学者笔记第二十四期 -- (面向对象编程)