用Java实现JVM第八章《数组和字符串》

│ │ │ ├── InstructionIndex16.java

│ │ │ ├── InstructionNoOperands.java

│ │ │ └── MethodInvokeLogic.java

│ │ ├── comparisons

│ │ ├── constants

│ │ ├── control

│ │ ├── conversions

│ │ ├── extended

│ │ ├── loads

│ │ ├── math

│ │ ├── references

│ │ │ ├── ANEW_ARRAY.java

│ │ │ ├── ARRAY_LENGTH.java

│ │ │ ├── CHECK_CAST.java

│ │ │ ├── GET_FIELD.java

│ │ │ ├── GET_STATIC.java

│ │ │ ├── INSTANCE_OF.java

│ │ │ ├── INVOKE_INTERFACE.java

│ │ │ ├── INVOKE_SPECIAL.java

│ │ │ ├── INVOKE_STATIC.java

│ │ │ ├── INVOKE_VIRTUAL.java

│ │ │ ├── MULTI_ANEW_ARRAY.java

│ │ │ ├── NEW.java

│ │ │ ├── NEW_ARRAY.java

│ │ │ ├── PUT_FIELD.java

│ │ │ └── PUT_STATIC.java

│ │ ├── stack

│ │ ├── store

│ │ │ └── xastore

│ │ │ ├── AASTORE.java

│ │ │ ├── BASTORE.java

│ │ │ ├── CASTORE.java

│ │ │ ├── DASTORE.java

│ │ │ ├── FASTORE.java

│ │ │ ├── IASTORE.java

│ │ │ ├── LASTORE.java

│ │ │ └── SASTORE.java

│ │ └── Factory

│ ├── rtda

│ │ ├── heap

│ │ │ ├── constantpool

│ │ │ ├── methodarea

│ │ │ │ ├── Class.java

│ │ │ │ ├── ClassMember.java

│ │ │ │ ├── Field.java

│ │ │ │ ├── Method.java

│ │ │ │ ├── MethodDescriptor.java

│ │ │ │ ├── MethodDescriptorParser.java

│ │ │ │ ├── MethodLookup.java

│ │ │ │ ├── Object.java

│ │ │ │ ├── Slots.java

│ │ │ │ └── StringPool.java

│ │ │ └── ClassLoader.java

│ │ ├── Frame.java

│ │ ├── JvmStack.java

│ │ ├── LocalVars.java

│ │ ├── OperandStack.java

│ │ ├── Slot.java

│ │ └── Thread.java

│ ├── Cmd.java

│ ├── Interpret.java

│ └── Main.java

└── test

└── java

└── org.itstack.demo.test

├── BubbleSortTest.java

└── HelloWorld.java

代码片段

ANEW_ARRAY.java

package org.itstack.demo.jvm.instructions.references;

import org.itstack.demo.jvm.instructions.base.InstructionIndex16;

import org.itstack.demo.jvm.rtda.Frame;

import org.itstack.demo.jvm.rtda.OperandStack;

import org.itstack.demo.jvm.rtda.heap.constantpool.ClassRef;

import org.itstack.demo.jvm.rtda.heap.constantpool.RunTimeConstantPool;

import org.itstack.demo.jvm.rtda.heap.methodarea.Class;

import org.itstack.demo.jvm.rtda.heap.methodarea.Object;

/**

  • http://www.itstack.org

  • create by fuzhengwei on 2019/4/29

  • create new array of reference

*/

public class ANEW_ARRAY extends InstructionIndex16 {

@Override

public void execute(Frame frame) {

RunTimeConstantPool runTimeConstantPool = frame.method().clazz().constantPool();

ClassRef classRef = (ClassRef) runTimeConstantPool.getConstants(this.idx);

Class componentClass = classRef.resolvedClass();

OperandStack stack = frame.operandStack();

int count = stack.popInt();

if (count < 0) {

throw new NegativeArraySizeException();

}

Class arrClass = componentClass.arrayClass();

Object arr = arrClass.newArray(count);

stack.pushRef(arr);

}

}

ARRAY_LENGTH.java

package org.itstack.demo.jvm.instructions.references;

import org.itstack.demo.jvm.instructions.base.InstructionNoOperands;

import org.itstack.demo.jvm.rtda.Frame;

import org.itstack.demo.jvm.rtda.OperandStack;

import org.itstack.demo.jvm.rtda.heap.methodarea.Object;

/**

  • http://www.itstack.org

  • create by fuzhengwei on 2019/4/29

  • get length of array

*/

public class ARRAY_LENGTH extends InstructionNoOperands {

@Override

public void execute(Frame frame) {

OperandStack stack = frame.operandStack();

Object arrRef = stack.popRef();

if (null == arrRef){

throw new NullPointerException();

}

int arrLen = arrRef.arrayLength();

stack.pushInt(arrLen);

}

}

NEW_ARRAY.java

package org.itstack.demo.jvm.instructions.references;

import org.itstack.demo.jvm.instructions.base.BytecodeReader;

import org.itstack.demo.jvm.instructions.base.Instruction;

import org.itstack.demo.jvm.rtda.Frame;

import org.itstack.demo.jvm.rtda.OperandStack;

import org.itstack.demo.jvm.rtda.heap.ClassLoader;

import org.itstack.demo.jvm.rtda.heap.methodarea.Class;

import org.itstack.demo.jvm.rtda.heap.methodarea.Object;

/**

  • http://www.itstack.org

  • create by fuzhengwei on 2019/4/29

*/

public class NEW_ARRAY implements Instruction {

private byte atype;

@Override

public void fetchOperands(BytecodeReader reader) {

this.atype = reader.readByte();

}

@Override

public void execute(Frame frame) {

OperandStack stack = frame.operandStack();

int count = stack.popInt();

if (count < 0) {

throw new NegativeArraySizeException();

}

ClassLoader classLoader = frame.method().clazz().loader();

Class arrClass = getPrimitiveArrayClass(classLoader, this.atype);

Object arr = arrClass.newArray(count);

stack.pushRef(arr);

}

private Class getPrimitiveArrayClass(ClassLoader loader, byte atype){

switch (atype) {

case ArrayType.AT_BOOLEAN:

return loader.loadClass(“[Z”);

case ArrayType.AT_BYTE:

return loader.loadClass(“[B”);

case ArrayType.AT_CHAR:

return loader.loadClass(“[C”);

case ArrayType.AT_SHORT:

return loader.loadClass(“[S”);

case ArrayType.AT_INT:

return loader.loadClass(“[I”);

case ArrayType.AT_LONG:

return loader.loadClass(“[J”);

case ArrayType.AT_FLOAT:

return loader.loadClass(“[F”);

case ArrayType.AT_DOUBLE:

return loader.loadClass(“[D”);

default:

throw new RuntimeException(“Invalid atype!”);

}

}

static class ArrayType {

static final byte AT_BOOLEAN = 4;

static final byte AT_CHAR = 5;

static final byte AT_FLOAT = 6;

static final byte AT_DOUBLE = 7;

static final byte AT_BYTE = 8;

static final byte AT_SHORT = 9;

static final byte AT_INT = 10;

static final byte AT_LONG = 11;

}

}

IASTORE.java

package org.itstack.demo.jvm.instructions.stores.xastore;

import org.itstack.demo.jvm.instructions.base.InstructionNoOperands;

import org.itstack.demo.jvm.rtda.Frame;

import org.itstack.demo.jvm.rtda.OperandStack;

import org.itstack.demo.jvm.rtda.heap.methodarea.Object;

/**

  • http://www.itstack.org

  • create by fuzhengwei on 2019/4/29

*/

public class IASTORE extends InstructionNoOperands {

@Override

public void execute(Frame frame) {

OperandStack stack = frame.operandStack();

int val = stack.popInt();

int idx = stack.popInt();

Object arrRef = stack.popRef();

checkNotNull(arrRef);

int[] ints = arrRef.ints();

checkIndex(ints.length, idx);

ints[idx] = val;

}

}

StringPool.java

package org.itstack.demo.jvm.rtda.heap.methodarea;

import org.itstack.demo.jvm.rtda.heap.ClassLoader;

import java.util.HashMap;

import java.util.Map;

/**

  • http://www.itstack.org

  • create by fuzhengwei on 2019/4/29

*/

public class StringPool {

private static Map<String, Object> internedStrs = new HashMap<>();

public static Object jString(ClassLoader loader, String goStr) {

Object internedStr = internedStrs.get(goStr);

if (null != internedStr) return internedStr;

char[] chars = goStr.toCharArray();

Object jChars = new Object(loader.loadClass(“[C”), chars);

Object jStr = loader.loadClass(“java/lang/String”).newObject();

jStr.setRefVal(“value”, “[C”, jChars);

internedStrs.put(goStr, jStr);

return jStr;

}

public static String goString(Object jStr) {

Object charArr = jStr.getRefVar(“value”, “[C”);

return new String(charArr.chars());

}

}

Interpret.java

package org.itstack.demo.jvm;

import com.alibaba.fastjson.JSON;

import org.itstack.demo.jvm.instructions.Factory;

import org.itstack.demo.jvm.instructions.base.BytecodeReader;

import org.itstack.demo.jvm.instructions.base.Instruction;

import org.itstack.demo.jvm.rtda.Frame;

import org.itstack.demo.jvm.rtda.Thread;

import org.itstack.demo.jvm.rtda.heap.ClassLoader;

import org.itstack.demo.jvm.rtda.heap.methodarea.*;

import org.itstack.demo.jvm.rtda.heap.methodarea.Class;

import org.itstack.demo.jvm.rtda.heap.methodarea.Object;

//指令集解释器

class Interpret {

Interpret(Method method, boolean logInst, String args) {

Thread thread = new Thread();

Frame frame = thread.newFrame(method);

thread.pushFrame(frame);

if (null != args){

Object jArgs = createArgsArray(method.clazz().loader(), args.split(" "));

frame.localVars().setRef(0, jArgs);

}

loop(thread, logInst);

}

private Object createArgsArray(ClassLoader loader, String[] args) {

Class stringClass = loader.loadClass(“java/lang/String”);

Object argsArr = stringClass.arrayClass().newArray(args.length);

Object[] jArgs = argsArr.refs();

for (int i = 0; i < jArgs.length; i++) {

jArgs[i] = StringPool.jString(loader, args[i]);

}

return argsArr;

}

private void loop(Thread thread, boolean logInst) {

BytecodeReader reader = new BytecodeReader();

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

读者福利

分享一份自己整理好的Java面试手册,还有一些面试题pdf

不要停下自己学习的脚步

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

nst) {

BytecodeReader reader = new BytecodeReader();

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-R61LyDVe-1710428344775)]
[外链图片转存中…(img-eUbGDMgS-1710428344776)]
[外链图片转存中…(img-EPRDuhEN-1710428344776)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-oTFc5lng-1710428344777)]

读者福利

分享一份自己整理好的Java面试手册,还有一些面试题pdf

不要停下自己学习的脚步

[外链图片转存中…(img-4n0aFloy-1710428344778)]

[外链图片转存中…(img-TjBtIwrX-1710428344778)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值