关于Class中的Signature属性
1、Signature属性:https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.9
2、ClassSignature、FieldTypeSignature、MethodTypeSignature说明:
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.2-200
3、JLS:https://docs.oracle.com/javase/specs/index.html
举个例子,如下:
interface IA{}
interface IB{}
class CA{}
class TP extends CA implements IA,IB{}
class ParentClass<T>{}
interface ParentIA{}
interface ParentIB{}
// 出现在ClassFile的attributes属性中的Signature属性
// <T:Lcom/test18/CA;:Lcom/test18/IA;:Lcom/test18/IB;E:TT;>
// Lcom/test18/ParentClass<Ljava/lang/String;>;
// Lcom/test18/ParentIA;Lcom/test18/ParentIB;
public class TestClass<T extends CA&IA&IB,E extends T>
extends ParentClass<String>
implements ParentIA,ParentIB{
// 出现在methods属性的attributes的Signature属性
// <A:Lcom/test18/CA;:Lcom/test18/IA;:Lcom/test18/IB;B:TA;>
// (TA;Ljava/util/List<+TB;>;)
// V
public <A extends CA&IA&IB,B extends A> void mymethod(A a,List<? extends B> list){
// 仅出现在常量池中,为什么?
// Ljava/util/List<Ljava/io/InputStream;>;
List<InputStream> x = null;
// Ljava/util/List<-Ljava/io/InputStream;>;
List<? super InputStream> y = null;
}
}
通过javap -verbose TestClass查看Class文件的结构:
Classfile /C:/TestClass.class
Last modified 2018-7-5; size 1058 bytes
MD5 checksum d9dc89733c2ea9a57bbced4b4c20f998
Compiled from "TestClass.java"
public class com.test18.TestClass<T extends com.test18.CA & com.test18.IA & com.test18.IB, E extends T> extends com.test18.ParentClass<java.lang.String> implements com.test18.ParentIA, com.test18.ParentIB
Signature: #29 // <T:Lcom/test18/CA;:Lcom/test18/IA;:Lcom/test18/IB;E:TT;>Lcom/test18/ParentClass<Ljava/lang/String;>;Lcom/test18/ParentIA;Lcom/test18/ParentIB;
SourceFile: "TestClass.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #3.#32 // com/test18/ParentClass."<init>":()V
#2 = Class #33 // com/test18/TestClass
#3 = Class #34 // com/test18/ParentClass
#4 = Class #35 // com/test18/ParentIA
#5 = Class #36 // com/test18/ParentIB
#6 = Utf8 <init>
#7 = Utf8 ()V
#8 = Utf8 Code
#9 = Utf8 LineNumberTable
#10 = Utf8 LocalVariableTable
#11 = Utf8 this
#12 = Utf8 Lcom/test18/TestClass;
#13 = Utf8 LocalVariableTypeTable
#14 = Utf8 Lcom/test18/TestClass<TT;TE;>;
#15 = Utf8 mymethod
#16 = Utf8 (Lcom/test18/CA;Ljava/util/List;)V
#17 = Utf8 a
#18 = Utf8 Lcom/test18/CA;
#19 = Utf8 list
#20 = Utf8 Ljava/util/List;
#21 = Utf8 x
#22 = Utf8 y
#23 = Utf8 TA;
#24 = Utf8 Ljava/util/List<+TB;>;
#25 = Utf8 Ljava/util/List<Ljava/io/InputStream;>;
#26 = Utf8 Ljava/util/List<-Ljava/io/InputStream;>;
#27 = Utf8 Signature
#28 = Utf8 <A:Lcom/test18/CA;:Lcom/test18/IA;:Lcom/test18/IB;B:TA;>(TA;Ljava/util/List<+TB;>;)V
#29 = Utf8 <T:Lcom/test18/CA;:Lcom/test18/IA;:Lcom/test18/IB;E:TT;>Lcom/test18/ParentClass<Ljava/lang/String;>;Lcom/test18/ParentIA;Lcom/test18/ParentIB;
#30 = Utf8 SourceFile
#31 = Utf8 TestClass.java
#32 = NameAndType #6:#7 // "<init>":()V
#33 = Utf8 com/test18/TestClass
#34 = Utf8 com/test18/ParentClass
#35 = Utf8 com/test18/ParentIA
#36 = Utf8 com/test18/ParentIB
{
public com.test18.TestClass();
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method com/test18/ParentClass."<init>":()V
4: return
LineNumberTable:
line 53: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/test18/TestClass;
LocalVariableTypeTable:
Start Length Slot Name Signature
0 5 0 this Lcom/test18/TestClass<TT;TE;>;
public <A extends com/test18/CA & com/test18/IA & com/test18/IB, B extends A> void mymethod(A, java.util.List<? extends B>);
flags: ACC_PUBLIC
Code:
stack=1, locals=5, args_size=3
0: aconst_null
1: astore_3
2: aconst_null
3: astore 4
5: return
LineNumberTable:
line 60: 0
line 61: 2
line 62: 5
LocalVariableTable:
Start Length Slot Name Signature
0 6 0 this Lcom/test18/TestClass;
0 6 1 a Lcom/test18/CA;
0 6 2 list Ljava/util/List;
2 4 3 x Ljava/util/List;
5 1 4 y Ljava/util/List;
LocalVariableTypeTable:
Start Length Slot Name Signature
0 6 0 this Lcom/test18/TestClass<TT;TE;>;
0 6 1 a TA;
0 6 2 list Ljava/util/List<+TB;>;
2 4 3 x Ljava/util/List<Ljava/io/InputStream;>;
5 1 4 y Ljava/util/List<-Ljava/io/InputStream;>;
Signature: #28 // <A:Lcom/test18/CA;:Lcom/test18/IA;:Lcom/test18/IB;B:TA;>(TA;Ljava/util/List<+TB;>;)V
}
关于Class中的Signature属性的更多相关文章
- 在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be closed first”
在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be ...
- 借助JavaScript中的Dom属性改变Html中Table边框的颜色
借助JavaScript中的Dom属性改变Html中Table边框的颜色 -------------------- <html> <head> <title>我是页 ...
- CSS 中关于background 属性功能
background 是 css中的核心属性,我们对他应该充分了解. background-image 定义背景图像 这个属性是我们用的最多的属性 设置背景图像有两个方式 background: ...
- android中xml tools属性详解
第一部分 安卓开发中,在写布局代码的时候,ide可以看到布局的预览效果. 但是有些效果则必须在运行之后才能看见,比如这种情况:TextView在xml中没有设置任何字符,而是在activity中设置了 ...
- echarts中显示效果option中必有的属性
写一个最简单的效果让option中不可缺少的属性. var option = { xAxis:[ //x轴,数组对象,其下至少有一个对象 {.....} ], yAxis:[//y轴,数组对象,其下可 ...
- Vue - 在v-repeat中使用计算属性
1.从后端获取JSON数据集合后,对单条数据应用计算属性,在Vue.js 0.12版本之前可以在v-repeat所在元素上使用v-component指令 在Vue.js 0.12版本之后使用自定义元素 ...
- DataGrid中的常用属性
DataGrid中的常用属性 $('#dg').datagrid({ url:'datagrid_data.json', columns:[[ {field:'code',title:'Code',w ...
- meta标签中的http-equiv属性使用介绍(转载)
meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言, ...
- Don’t Use Accessor Methods in Initializer Methods and dealloc 【初始化和dealloc方法中不要调用属性的存取方法,而要直接调用 _实例变量】
1.问题: 在dealloc方法中使用[self.xxx release]和[xxx release]的区别? 用Xcode的Analyze分析我的Project,会列出一堆如下的提示:Inco ...
随机推荐
- 字符串转换成NSDate类型的 为nil解决方法
方法一 通过下列函数来解决 但是得到的日期会改变 修改方法fix - (NSDate *)timeForString:(NSString *)string { NSMut ...
- C# 读取Excel表格内容,以及NPOI的使用
在实际的开发中,我们可能需要读写word或者Excel的内容,在我开发的项目中,需要读取Excel的内容,并将相对应的内容存储到数据库中,这里简单跟大家分享一下,希望能够帮助一些人. 我相信在读写wo ...
- 用eFrameWork框架实现快捷搜索
软件系统最大的价值在于用心去帮客户解决各种痛点,需要做好方方面面的工作,数据的快捷搜索就是其中比较重要的一个环节.那么,什么样的搜索方式才是最高效快捷的呢?目前能想到最好的办法是用名称声母检索,用声母 ...
- Unity/C#基础复习(3) 之 String与StringBuilder的关系
参考资料 [1] @毛星云[<Effective C#>提炼总结] https://zhuanlan.zhihu.com/p/24553860 [2] <C# 捷径教程> [3 ...
- docker 多阶段构建
构建镜像最具挑战性的一点是使镜像大小尽可能的小.Dockerfile中的每条指令都为图像添加了一个图层,您需要记住在移动到下一层之前清理任何不需要的工件.对于多阶段构建,您可以在Dockerfile中 ...
- 构建NetCore应用框架之实战篇(四):BitAdminCore框架1.0登录功能细化及技术选型
本篇承接上篇内容,如果你不小心点击进来,建议从第一篇开始完整阅读,文章内容继承性连贯性. 构建NetCore应用框架之实战篇系列 一.BitAdminCore框架1.0版本 1.1.0版本是指最小版本 ...
- Asp.net MVC Linq to SQL Model verification
Models public class Student { public int Id { get; set; } [Required(ErrorMessage = "姓名不能为空!&quo ...
- C# OleDbConnection对特定部分Excel的数据读取
最近在写winform程序,先来一个简单的. 读取特定部分Excel的数据读取,读取Excel第30行开始到H列的数据 using System;using System.Collections.Ge ...
- 【转】SQL FOR XML简介及用法
摘要:sql中的for xml语法为表转化为xml提供了很好的支持,当然使用同样的程序语言也能够达到同样的效果,但是有了for xml将使得这一切更加的方便. 主要内容: Select 的查询结果会作 ...
- 批处理系列(14) - 路径/时间/字符切分等DEMO操作
结合本系列文章第一篇,看本文. 本篇熟悉操作文件路径.时间,温习字符切分. 路径 @echo off @REM @Author: xianghongai@gmail.com :GTCONTINUE @ ...