JVM 가상 머신은 --- (12) 클래스 콜렉션의 테이블 파일 구조 속성

면책 조항 :이 문서는 블로거 원본입니다, 추적 에 의해-SA의 CC 4.0 저작권 계약, 복제, 원본 소스 링크이 문을 첨부 해주세요.
이 링크 : https://blog.csdn.net/qq1021979964/article/details/97785731

속성 시트 모음

        그리고 코드 ConstantValue 테이블에 대한 방법은 필드가 테이블에 나타납니다, LineNumberTable 속성 시트 세트 테이블 전에 속성을 볼 수 없습니다, 이해가 안되지, 나는이 조금 무지 힘보고, 지금은 특별한 속성 테이블을 말한다.

       테이블과 테이블 방법의 분야에서 속성 시트 (attribute_info)는 테이블 방법은 특정 장면의 독점에 대한 설명, 속성 테이블의 자신의 세트를 가져올 수있는, 필드 테이블, 클래스 파일에 등장했다.

       클래스 파일과 순서, 내용과 다른 길이에 필요한 다른 엄격한 데이터 항목, 제한 설정 속성 테이블이 약간 느슨한이며, 각 속성 테이블은 더 이상 엄격한 순서를 필요로하지 않았다, 그들은 속성 이름을 기존 중복되지 않으며, 어떤 구현 컴파일러는 속성 시트 등의 속성 정보의 자신의 정의를 쓸 수, 무시는 Java 가상 머신이 실행되고 인식하지 못하는 속성.

        각 속성에 대한, 그것의 이름은 CONSTANT_Utf8_info 종류를 나타내는 상수의 상수 풀을 참조 할 필요가 있고, 속성 값의 구조 U4의 속성의 길이가 차지하는 속성 값만 비트들을 설명하기 위해 완전히 사용자 지정할 수는 일 수있다

 

코드는 도입하지 않는 특성을 여기에 소개

1.Code 특성

처리 후의 방법 본체 코드 컴파일러 javac의 코드 속성이 속성 세트의 메소드 테이블에서 나타나는 속성 코드에 저장된 최종 바이트 지시된다, 그러나 모든 특성은 본 발명의 방법, 예를 들어 있어야 인터페이스의 방법은, 추상 클래스는 코드 속성에 존재하지 않습니다.

2. 케이스 코드

public class TestMethod {

    public int add(int a,int b) {
		return a+b;
	}

}

나는 게으른 포인트 해요,하지만은 javap의 표는 해당 데이터를 얻기 속성 코드의 이름에 대한 속성 시트를 찾을 너무 정확한 방법 (6)이, 찾을 다음 클래스 파일.

사례 3. 생성자 속성

  1. 属性表名称索引:0x0006(对应十进制为6),指向常量池的第6,为Code,表示是Code类型的属性表。
  2. 属性长度:0x0000 001D(对应十进制的29),表示后续29个字节是表示这个Code属性表的信息。
  3. 操作数栈的最大深度:0x0001(对应十进制的1),表示栈帧中操作数栈的最大深度是1。
  4. 局部变量表的最大容量:0x0001(对应十进制的1),JVM调用该方法时,根据这个值设置栈帧中的局部变量表的大小。
  5. 机器指令数目:0x0000 0005,表示后续的5个字节是机器指令集。
  6. 机器指令集:0x002A、0x00B7、0x0000、0x0001、0x00B1。
  7. 异常表:0x0000,表示异常为0。
  8. Code属性的属性表集合:0x0001,表示后面还有一个属性表。后面跟着这个属性。

如果再看的话,那就是0x0007:对应常量池,是LineNumberTable。这个就不用说了。

别忘了,这个是默认的无参构造器的属性表,想找add,还的继续找。

4.自定义方法属性案例

  1. 属性表名称索引:0x0006(对应十进制为6),指向常量池的第6,为Code,表示是Code类型的属性表。
  2. 属性长度:0x0000 001C(对应十进制的28),表示后续28个字节是表示这个Code属性表的信息。
  3. 操作数栈的最大深度:0x0002(对应十进制的2),表示栈帧中操作数栈的最大深度是2。
  4. 局部变量表的最大容量:0x0003(对应十进制的3),JVM调用该方法时,根据这个值设置栈帧中的局部变量表的大小。
  5. 机器指令数目:0x0000 0004,表示后续的4个字节是机器指令集。
  6. 机器指令集:0x001B、0x001C、0x0060、0x00AC。
  7. 异常表:0x0000,表示异常为0。
  8. Code属性的属性表集合:0x0001,表示后面还有一个属性表。后面跟着这个属性。

如果再看的话,那就是0x0007:对应常量池,是LineNumberTable。这个就不用说了。

 

추천

출처blog.csdn.net/qq1021979964/article/details/97785731